#include <bits/stdc++.h>
using namespace std;
int N, D, L;
int a[100005];
int tam[100005];
int men[100005][16 + 5];
int may[100005][16 + 5];
int tree[100005 * 4];
int dp[100005];
void upd(int x, int l, int r, int q, int v) {
  if (l > q or r < q) return;
  if (l == r) {
    tree[x] = v;
    return;
  }
  int mid = (l + r) / 2;
  upd(2 * x + 1, l, mid, q, v);
  upd(2 * x + 2, mid + 1, r, q, v);
  tree[x] = min(tree[2 * x + 1], tree[2 * x + 2]);
}
int qry(int x, int l, int r, int lq, int rq) {
  if (l > rq or r < lq) return 1e9;
  if (l >= lq && r <= rq) return tree[x];
  int mid = (l + r) / 2;
  return min(qry(2 * x + 1, l, mid, lq, rq),
             qry(2 * x + 2, mid + 1, r, lq, rq));
}
void doSparse() {
  for (int i = 0; i <= 16; i++) tam[(1 << i)] = i;
  for (int i = 1; i <= N; i++)
    if (!tam[i]) tam[i] = tam[i - 1];
  for (int i = 1; i <= N; i++) men[i][0] = may[i][0] = a[i];
  for (int j = 1; j <= 16; j++)
    for (int i = 1; i <= N; i++) {
      int sig = i + (1 << (j - 1));
      if (sig <= N) {
        men[i][j] = min(men[i][j - 1], men[sig][j - 1]);
        may[i][j] = max(may[i][j - 1], may[sig][j - 1]);
      }
    }
}
int check(int l, int r) {
  if (l > r) return 1e9;
  l = min(l, N + 1);
  r = min(r, N + 1);
  if (r == N + 1) return 0;
  return qry(0, 1, N, l, r);
}
int diff(int l, int r) {
  int i = tam[r - l + 1];
  int B = max(may[l][i], may[r - (1 << i) + 1][i]);
  int b = min(men[l][i], men[r - (1 << i) + 1][i]);
  return B - b;
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cin >> N >> D >> L;
  for (int i = 1; i <= N; i++) cin >> a[i];
  doSparse();
  for (int i = N; i >= 1; i--) {
    dp[i] = 1e9;
    int l = i;
    int r = N;
    while (l < r) {
      int mid = (l + r + 1) / 2;
      if (diff(i, mid) <= D)
        l = mid;
      else
        r = mid - 1;
    }
    dp[i] = min(dp[i], 1 + check(i + L, r + 1));
    upd(0, 1, N, i, dp[i]);
  }
  cout << (dp[1] == 1e9 ? -1 : dp[1]);
  return 0;
}
