#include <bits/stdc++.h>
using namespace std;
int v[100010];
int mn, mx;
pair<int, int> T[100010 * 4];
int dp[100010 * 4];
int n, s, len;
void build(int l, int r, int node) {
  if (l == r) {
    T[node] = {v[l], v[l]};
    return;
  }
  build(l, (l + r) / 2, node * 2);
  build((l + r) / 2 + 1, r, node * 2 + 1);
  T[node].first = min(T[node * 2].first, T[node * 2 + 1].first);
  T[node].second = max(T[node * 2].second, T[node * 2 + 1].second);
}
void upd(int pos, int x, int l, int r, int node) {
  if (l == r) {
    dp[node] = x;
    return;
  }
  if (pos <= (l + r) / 2)
    upd(pos, x, l, (l + r) / 2, node * 2);
  else
    upd(pos, x, (l + r) / 2 + 1, r, node * 2 + 1);
  dp[node] = min(dp[node * 2], dp[node * 2 + 1]);
}
void tap(int a, int b, int l, int r, int node) {
  if (a > r || b < l) return;
  if (l >= a && r <= b) {
    mn = min(mn, T[node].first);
    mx = max(mx, T[node].second);
    return;
  }
  tap(a, b, l, (l + r) / 2, node * 2);
  tap(a, b, (l + r) / 2 + 1, r, node * 2 + 1);
}
int tap2(int a, int b, int l, int r, int node) {
  if (a > r || b < l) return 1e9;
  if (l >= a && r <= b) return dp[node];
  return min(tap2(a, b, l, (l + r) / 2, node * 2),
             tap2(a, b, (l + r) / 2 + 1, r, node * 2 + 1));
}
int main() {
  cin >> n >> s >> len;
  for (int i = 1; i <= n; i++) cin >> v[i];
  build(1, n, 1);
  for (int i = 1; i <= n; i++) {
    int l = 1, m, r = i - len + 1, ans = 1e9;
    while (l <= r) {
      m = (l + r) / 2;
      mn = 1e9, mx = -1e9;
      tap(m, i, 1, n, 1);
      if (mx - mn <= s)
        r = m - 1, ans = min(ans, m);
      else
        l = m + 1;
    }
    if (ans == 1e9) {
      upd(i, 1e9, 0, n, 1);
      continue;
    }
    int a = tap2(ans - 1, i - len, 0, n, 1);
    upd(i, a + 1, 0, n, 1);
  }
  int ans = tap2(n, n, 0, n, 1);
  if (ans > n) ans = -1;
  cout << ans;
}
