#include <bits/stdc++.h>
using namespace std;
const int maxn = (int)1e5 + 11;
const int inf = int(1e9);
const int mod = inf + 7;
const double eps = 1e-9;
const double pi = acos(-1.0);
int n, second, l, a[maxn];
int two[maxn], dp[2][17][maxn];
int t[4 * maxn], d[maxn];
void process() {
  two[1] = 0;
  for (int i = 2; i < maxn; i++) two[i] = 1 + two[i / 2];
  for (int i = 1; i <= n; i++) {
    dp[0][0][i] = a[i];
    dp[1][0][i] = a[i];
  }
  for (int lvl = 1; (1 << lvl) <= n; lvl++) {
    for (int i = 1; i + (1 << lvl) <= n + 1; i++) {
      dp[0][lvl][i] =
          min(dp[0][lvl - 1][i], dp[0][lvl - 1][i + (1 << (lvl - 1))]);
      dp[1][lvl][i] =
          max(dp[1][lvl - 1][i], dp[1][lvl - 1][i + (1 << (lvl - 1))]);
    }
  }
}
int getmin(int l, int r) {
  int lvl = two[r - l + 1];
  return min(dp[0][lvl][l], dp[0][lvl][r - (1 << lvl) + 1]);
}
int getmax(int l, int r) {
  int lvl = two[r - l + 1];
  return max(dp[1][lvl][l], dp[1][lvl][r - (1 << lvl) + 1]);
}
void build(int v, int tl, int tr) {
  if (tl == tr)
    t[v] = inf;
  else {
    int mid = (tl + tr) >> 1;
    build(2 * v, tl, mid);
    build(2 * v + 1, mid + 1, tr);
    t[v] = min(t[2 * v], t[2 * v + 1]);
  }
}
int getmin(int v, int tl, int tr, int l, int r) {
  if (l > r) return inf;
  if (l == tl && r == tr) return t[v];
  int mid = (tl + tr) >> 1;
  int ans1 = getmin(2 * v, tl, mid, l, min(r, mid));
  int ans2 = getmin(2 * v + 1, mid + 1, tr, max(mid + 1, l), r);
  return min(ans1, ans2);
}
void update(int v, int tl, int tr, int pos, int val) {
  if (tl == tr) {
    t[v] = min(t[v], val);
  } else {
    int mid = (tl + tr) >> 1;
    if (pos <= mid)
      update(2 * v, tl, mid, pos, val);
    else
      update(2 * v + 1, mid + 1, tr, pos, val);
    t[v] = min(t[2 * v], t[2 * v + 1]);
  }
}
bool good(int l, int r) {
  int mn = getmin(l, r);
  int mx = getmax(l, r);
  return mx - mn <= second;
}
int main() {
  scanf("%d%d%d", &n, &second, &l);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  process();
  build(1, 0, n);
  update(1, 0, n, 0, 0);
  for (int i = 0; i < maxn; i++) d[i] = inf;
  d[0] = 0;
  for (int i = l; i <= n; i++) {
    int L = 1, r = i;
    int ans = i;
    while (L <= r) {
      int mid = (L + r) >> 1;
      if (good(mid, i)) {
        ans = mid;
        r = mid - 1;
      } else
        L = mid + 1;
    }
    if (ans - 1 > i - l) {
      d[i] = inf;
      continue;
    }
    d[i] = min(d[i], 1 + getmin(1, 0, n, ans - 1, i - l));
    update(1, 0, n, i, d[i]);
  }
  if (d[n] == inf) d[n] = -1;
  printf("%d\n", d[n]);
  return 0;
}
