#include <bits/stdc++.h>
using namespace std;
int tree[400111];
inline void build(int id, int l, int r) {
  tree[id] = 1000111222;
  if (l == r) return;
  build(id * 2 + 1, l, (l + r) / 2);
  build(id * 2 + 2, (l + r) / 2 + 1, r);
}
inline void upd(int id, int l, int r, int p, int k) {
  if (l == r) {
    tree[id] = k;
    return;
  }
  int mid = (l + r) / 2;
  if (p <= mid) upd(id * 2 + 1, l, mid, p, k);
  if (p > mid) upd(id * 2 + 2, mid + 1, r, p, k);
  tree[id] = min(tree[id * 2 + 1], tree[id * 2 + 2]);
}
inline int query(int id, int l, int r, int ki, int ka) {
  if (ka < ki) return 1000111222;
  if (ki <= l and r <= ka) return tree[id];
  int mid = (l + r) / 2;
  int ret = 1000111222;
  if (ki <= mid) ret = min(ret, query(id * 2 + 1, l, mid, ki, ka));
  if (ka > mid) ret = min(ret, query(id * 2 + 2, mid + 1, r, ki, ka));
  return ret;
}
int n, s, l;
int ar[100111];
int dp[100111];
multiset<int> qar;
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ;
  cin >> n >> s >> l;
  for (int i = 1; i <= n; i++) cin >> ar[i];
  build(0, 1, n + 1);
  int r = n;
  dp[n + 1] = 0;
  upd(0, 1, n + 1, n + 1, 0);
  for (int i = n; i >= 1; i--) {
    qar.insert(ar[i]);
    while (!qar.empty() and *qar.rbegin() - *qar.begin() > s) {
      qar.erase(qar.find(ar[r]));
      r--;
    }
    dp[i] = query(0, 1, n + 1, i + l, r + 1) + 1;
    upd(0, 1, n + 1, i, dp[i]);
  }
  if (dp[1] >= 1000111222)
    cout << "-1\n";
  else
    cout << dp[1] << "\n";
}
