#include <bits/stdc++.h>
using namespace std;
class segtree1 {
 public:
  long long seg[262144 * 2];
  void update(int a, long long b) {
    a += 262144;
    seg[a] = b;
    for (;;) {
      a /= 2;
      if (a == 0) break;
      seg[a] = max(seg[a * 2], seg[a * 2 + 1]);
    }
  }
  long long get(int beg, int end, int node, int lb, int ub) {
    if (ub < beg || end < lb) return -2100000000000;
    if (beg <= lb && ub <= end) return seg[node];
    return max(get(beg, end, node * 2, lb, (lb + ub) / 2),
               get(beg, end, node * 2 + 1, (lb + ub) / 2 + 1, ub));
  }
};
segtree1 mx;
class segtree2 {
 public:
  long long seg[262144 * 2];
  void update(int a, long long b) {
    a += 262144;
    seg[a] = b;
    for (;;) {
      a /= 2;
      if (a == 0) break;
      seg[a] = min(seg[a * 2], seg[a * 2 + 1]);
    }
  }
  long long get(int beg, int end, int node, int lb, int ub) {
    if (ub < beg || end < lb) return 2100000000000;
    if (beg <= lb && ub <= end) return seg[node];
    return min(get(beg, end, node * 2, lb, (lb + ub) / 2),
               get(beg, end, node * 2 + 1, (lb + ub) / 2 + 1, ub));
  }
};
segtree2 mi;
segtree2 dp;
int main() {
  int num, len;
  long long gen;
  scanf("%d%I64d%d", &num, &gen, &len);
  for (int i = 0; i < num; i++) {
    int z;
    scanf("%d", &z);
    mx.update(i, z);
    mi.update(i, z);
  }
  int pt = 0;
  dp.update(0, 0);
  for (int i = 0; i < num; i++) {
    for (;;) {
      if (mx.get(pt, i, 1, 0, 262144 - 1) - mi.get(pt, i, 1, 0, 262144 - 1) >
          gen)
        pt++;
      else
        break;
    }
    long long t = dp.get(pt, i - len + 1, 1, 0, 262144 - 1);
    dp.update(i + 1, t + 1);
  }
  if (dp.get(num, num, 1, 0, 262144 - 1) > 1000000000LL)
    printf("-1\n");
  else
    printf("%lld\n", dp.get(num, num, 1, 0, 262144 - 1));
}
