#include <bits/stdc++.h>
using namespace std;
int A[111111];
int X[111111];
int mi[111111 * 4], ma[111111 * 4], R[111111 * 4];
void build(int x, int l, int r) {
  if (l == r) {
    mi[x] = ma[x] = A[l];
    R[x] = X[l];
    return;
  }
  int m = (l + r) / 2;
  build(2 * x, l, m);
  build(2 * x + 1, m + 1, r);
  mi[x] = min(mi[2 * x], mi[2 * x + 1]);
  ma[x] = max(ma[2 * x], ma[2 * x + 1]);
  R[x] = min(R[2 * x], R[2 * x + 1]);
}
int pos, ql, qr;
void update(int x, int l, int r) {
  if (l == r) {
    R[x] = X[l];
    return;
  }
  int m = (l + r) / 2;
  if (pos <= m)
    update(2 * x, l, m);
  else
    update(2 * x + 1, m + 1, r);
  R[x] = min(R[2 * x], R[2 * x + 1]);
}
int query(int x, int l, int r, int V[]) {
  if (ql <= l and r <= qr) return V[x];
  if (qr < l or r < ql) return 1111111111;
  int m = (l + r) / 2;
  return min(query(2 * x, l, m, V), query(2 * x + 1, m + 1, r, V));
}
int queryMax(int x, int l, int r) {
  if (ql <= l and r <= qr) return ma[x];
  if (qr < l or r < ql) return -1111111111;
  int m = (l + r) / 2;
  return max(queryMax(2 * x, l, m), queryMax(2 * x + 1, m + 1, r));
}
int main() {
  for (int i = 0; i < 111111; i++) X[i] = 1111111111;
  int N, S, L;
  cin >> N >> S >> L;
  for (int i = 1; i <= N; i++) cin >> A[i];
  build(1, 1, N);
  for (int i = N - L + 1; i > 0; i--) {
    ql = i, qr = i + L - 1;
    int diff = queryMax(1, 1, N) - query(1, 1, N, mi);
    if (diff > S) continue;
    int lo = i + L - 1, hi = N;
    while (lo <= hi) {
      int m = (lo + hi) / 2;
      ql = i, qr = m;
      diff = queryMax(1, 1, N) - query(1, 1, N, mi);
      if (diff > S)
        hi = m - 1;
      else
        lo = m + 1;
    }
    if (hi == N) {
      X[i] = 1;
      pos = i;
      update(1, 1, N);
    } else if (hi >= i + L - 1) {
      ql = i + L, qr = hi + 1;
      X[i] = query(1, 1, N, R) + 1;
      pos = i;
      update(1, 1, N);
    }
  }
  if (X[1] < 1111111111)
    cout << X[1];
  else
    cout << -1;
}
