#include <bits/stdc++.h>
using namespace std;
long long rmq[20][100002], rmxq[20][100002];
signed main() {
  long long n, s, l;
  cin >> n >> s >> l;
  long long a[n];
  for (auto& i : a) cin >> i;
  for (long long i = 0; i < n; i++) rmq[0][i] = a[i];
  for (long long i = 1; (1 << i) <= n; i++)
    for (long long j = 0; j + (1 << i) - 1 < n; j++) {
      rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
    }
  auto rmqq = [&](long long l, long long r) {
    long long LOG2 = log2(r - l + 1);
    return min(rmq[LOG2][l], rmq[LOG2][r - (1 << (LOG2)) + 1]);
  };
  for (long long i = 0; i < n; i++) rmxq[0][i] = a[i];
  for (long long i = 1; (1 << i) <= n; i++)
    for (long long j = 0; j + (1 << i) - 1 < n; j++) {
      rmxq[i][j] = max(rmxq[i - 1][j], rmxq[i - 1][j + (1 << (i - 1))]);
    }
  auto rmxqq = [&](long long l, long long r) {
    long long LOG2 = log2(r - l + 1);
    return max(rmxq[LOG2][l], rmxq[LOG2][r - (1 << (LOG2)) + 1]);
  };
  if (rmxqq(0, l - 1) - rmqq(0, l - 1) > s) {
    puts("-1");
    return 0;
  }
  vector<long long> avail;
  long long f[n];
  avail.push_back(0);
  for (long long i = 0; i < l - 1; i++) {
    f[i] = 0;
  }
  for (long long i = l - 1; i < n; i++) {
    long long lo = 0;
    long long hi = prev(upper_bound(avail.begin(), avail.end(), i - l + 1)) -
                   avail.begin();
    while (lo < hi) {
      long long mid = (lo + hi) / 2;
      if (rmxqq(avail[mid], i) - rmqq(avail[mid], i) <= s) {
        hi = mid;
      } else
        lo = mid + 1;
    }
    if (lo >= avail.size() || lo < 0 || avail[lo] > i - l + 1) {
      f[i] = LLONG_MAX;
      continue;
    }
    lo = avail[lo];
    if (lo > 0 && f[lo - 1] == LLONG_MAX) {
      f[i] = LLONG_MAX;
      continue;
    }
    if (rmxqq(lo, i) - rmqq(lo, i) <= s) {
      f[i] = (lo > 0 ? f[lo - 1] : 0) + 1;
      avail.push_back(i + 1);
    } else
      f[i] = LLONG_MAX;
  }
  cout << (f[n - 1] != LLONG_MAX && f[n - 1] != 0 ? f[n - 1] : -1);
}
