#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5, inf = 1e6;
int n, maxDif, k;
int a[MAXN], dp[MAXN];
int stmax[MAXN][20], stmin[MAXN][20];
int sm[MAXN * 4];
int Min(int l, int r) {
  int len = log2(r - l + 1);
  return min(a[stmin[l][len]], a[stmin[r - (1 << len) + 1][len]]);
}
int Max(int l, int r) {
  int len = log2(r - l + 1);
  return max(a[stmax[l][len]], a[stmax[r - (1 << len) + 1][len]]);
}
int dif(int l, int r) { return Max(l, r) - Min(l, r); }
void SparseTable() {
  for (int i = 0; i < n; i++) stmax[i][0] = i, stmin[i][0] = i;
  for (int len = 1; (1 << len) <= n; len++) {
    for (int i = 0; i + (1 << len) <= n; i++) {
      if (a[stmax[i][len - 1]] < a[stmax[i + (1 << (len - 1))][len - 1]]) {
        stmax[i][len] = stmax[i + (1 << (len - 1))][len - 1];
      } else {
        stmax[i][len] = stmax[i][len - 1];
      }
      if (a[stmin[i][len - 1]] > a[stmin[i + (1 << (len - 1))][len - 1]])
        stmin[i][len] = stmin[i + (1 << (len - 1))][len - 1];
      else
        stmin[i][len] = stmin[i][len - 1];
    }
  }
}
void update(int v, int l, int r, int pos, int val) {
  if (pos < l || pos > r) return;
  if (pos == l && l == r) {
    sm[v] = val;
    return;
  }
  int m = (l + r) >> 1;
  update(v * 2, l, m, pos, val);
  update(v * 2 + 1, m + 1, r, pos, val);
  sm[v] = min(sm[v * 2], sm[v * 2 + 1]);
}
int Get(int v, int l, int r, int tl, int tr) {
  if (l > tr || r < tl) return inf;
  if (tl <= l && r <= tr) return sm[v];
  int m = (l + r) >> 1;
  return min(Get(v * 2, l, m, tl, tr), Get(v * 2 + 1, m + 1, r, tl, tr));
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> maxDif >> k;
  for (int i = 0; i < n; i++) cin >> a[i];
  SparseTable();
  for (int i = 0; i < n * 4 + 5; i++) sm[i] = inf;
  for (int i = k - 1; i < n; i++) {
    int l = 0, r = i, id;
    while (l <= r) {
      int m = (l + r) >> 1;
      int t = dif(m, i);
      if (t <= maxDif) {
        id = m;
        r = m - 1;
      } else
        l = m + 1;
    }
    if (i - id + 1 < k)
      update(1, 0, n - 1, i, inf);
    else {
      if (id == 0) {
        update(1, 0, n - 1, i, 1);
      } else {
        int t = Get(1, 0, n - 1, id - 1, i - k);
        update(1, 0, n - 1, i, t + 1);
      }
    }
  }
  int t = Get(1, 0, n - 1, n - 1, n - 1);
  if (t == inf)
    cout << -1;
  else
    cout << t;
}
