#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 5;
const int INF = 1000 * 1000 * 1000 + 10;
int n, s, l, mini[4 * N], maxi[4 * N], val[4 * N], id[N], dp[N], a[N];
inline int abs(int x) {
  if (x < 0) return -x;
  return x;
}
void make(int idx, int lo, int hi) {
  if (lo == hi) {
    val[idx] = dp[lo];
    id[lo] = idx;
    return;
  }
  int mid = lo + hi >> 1;
  make(2 * idx, lo, mid);
  make(2 * idx + 1, mid + 1, hi);
  val[idx] = min(val[2 * idx], val[2 * idx + 1]);
}
void make2(int idx, int lo, int hi) {
  if (lo == hi) {
    mini[idx] = maxi[idx] = a[lo];
    return;
  }
  int mid = lo + hi >> 1;
  make2(2 * idx, lo, mid);
  make2(2 * idx + 1, mid + 1, hi);
  mini[idx] = min(mini[2 * idx], mini[2 * idx + 1]);
  maxi[idx] = max(maxi[2 * idx], maxi[2 * idx + 1]);
}
int ask2n(int idx, int lo, int hi, int l, int r) {
  if (l <= lo && hi <= r) return mini[idx];
  if (lo > r || hi < l) return INF;
  int mid = lo + hi >> 1;
  return min(ask2n(2 * idx, lo, mid, l, r),
             ask2n(2 * idx + 1, mid + 1, hi, l, r));
}
int ask2m(int idx, int lo, int hi, int l, int r) {
  if (l <= lo && hi <= r) return maxi[idx];
  if (lo > r || hi < l) return -INF;
  int mid = lo + hi >> 1;
  return max(ask2m(2 * idx, lo, mid, l, r),
             ask2m(2 * idx + 1, mid + 1, hi, l, r));
}
int ask(int idx, int lo, int hi, int l, int r) {
  if (l <= lo && hi <= r) return val[idx];
  if (lo > r || hi < l) return INF;
  int mid = lo + hi >> 1;
  return min(ask(2 * idx, lo, mid, l, r), ask(2 * idx + 1, mid + 1, hi, l, r));
}
int bin(int idx) {
  int lo = 1, hi = idx - 1, mid, res = 0;
  while (lo <= hi) {
    mid = lo + hi >> 1;
    if (abs(ask2n(1, 1, n, mid, idx - 1) - a[idx]) > s ||
        abs(ask2m(1, 1, n, mid, idx - 1) - a[idx]) > s ||
        abs(ask2n(1, 1, n, mid, idx - 1) - ask2m(1, 1, n, mid, idx - 1)) > s) {
      res = mid;
      lo = mid + 1;
    } else
      hi = mid - 1;
  }
  return res;
}
void upd(int v, int idx) {
  val[v] = dp[idx];
  v >>= 1;
  while (v > 0) {
    val[v] = min(val[2 * v], val[2 * v + 1]);
    v >>= 1;
  }
}
int main() {
  scanf("%d%d%d", &n, &s, &l);
  scanf("%d", a + 1);
  mini[1] = maxi[1] = a[1];
  dp[1] = INF;
  for (int i = 2; i <= n; i++) {
    dp[i] = INF;
    scanf("%d", a + i);
  }
  if (l > n) {
    printf("-1\n");
    return 0;
  }
  make2(1, 1, n);
  dp[0] = 0;
  if (abs(ask2n(1, 1, n, 1, l) - ask2m(1, 1, n, 1, l)) <= s)
    dp[l] = 1;
  else {
    printf("-1\n");
    return 0;
  }
  make(1, 0, n);
  int k;
  for (int i = l + 1; i <= n; i++) {
    k = bin(i);
    if (k <= i - l) {
      if (k > 0)
        dp[i] = ask(1, 0, n, k, i - l) + 1;
      else
        dp[i] = 1;
      upd(id[i], i);
    }
  }
  if (dp[n] >= INF)
    printf("-1\n");
  else
    printf("%d\n", dp[n]);
  return 0;
}
