#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
struct note {
  int x, id;
} q[maxn];
int st[maxn][20], st1[maxn][20], a[maxn], n, dp[maxn];
int head, tail;
void init(int n) {
  for (int i = 1; i <= n; i++) st1[i][0] = st[i][0] = a[i];
  for (int j = 1; j < 20; j++)
    for (int i = 1; i <= n; i++)
      if (i + (1 << (j - 1)) <= n)
        st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]),
        st1[i][j] = max(st1[i][j - 1], st1[i + (1 << (j - 1))][j - 1]);
}
int query(int l, int r) {
  int len = log2(r - l + 1);
  return max(st1[l][len], st1[r - (1 << len) + 1][len]) -
         min(st[l][len], st[r - (1 << len) + 1][len]);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int s, len;
  cin >> n >> s >> len;
  for (int i = 1; i <= n; i++) cin >> a[i];
  init(n);
  int l, r, ans;
  if (len > n || query(1, len) > s) return cout << -1 << endl, 0;
  memset(dp, 0x3f3f3f3f, sizeof(dp));
  dp[0] = 0;
  q[tail].id = 0, q[tail].x = 0, tail++;
  dp[len] = 1;
  for (int i = len + 1; i <= n; i++) {
    l = 1, r = i - len + 1, ans = -1;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if (query(mid, i) <= s)
        r = mid - 1, ans = mid;
      else
        l = mid + 1;
    }
    while (head < tail && q[tail - 1].x >= dp[i - len]) tail--;
    q[tail].x = dp[i - len], q[tail].id = i - len, tail++;
    if (ans != -1) {
      while (head < tail && q[head].id < ans - 1) head++;
      if (head < tail) dp[i] = min(dp[i], q[head].x + 1);
    }
  }
  if (dp[n] == 0x3f3f3f3f) dp[n] = -1;
  cout << dp[n] << endl;
}
