#include <bits/stdc++.h>
const int INF = 12345678;
using namespace std;
const int N = 1e5 + 7;
int st1[N][20], st2[N][20];
int a[N], dp[N];
struct node {
  node(){};
  node(int a1, int a2) : first(a1), second(a2){};
  int first, second;
} q[N];
int query(int l, int r) {
  if (l >= r) return 0;
  int len = log2(r - l + 1);
  return max(st1[l][len], st1[r - (1 << len) + 1][len]) -
         min(st2[l][len], st2[r - (1 << len) + 1][len]);
}
int main() {
  ios::sync_with_stdio(false);
  int n, s, l;
  cin >> n >> s >> l;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= n; i++) st1[i][0] = st2[i][0] = a[i];
  for (int j = 1; j < 20; j++) {
    for (int i = 1; i <= n; i++) {
      if (i + (1 << (j - 1)) <= n) {
        st1[i][j] = max(st1[i][j - 1], st1[i + (1 << (j - 1))][j - 1]);
        st2[i][j] = min(st2[i][j - 1], st2[i + (1 << (j - 1))][j - 1]);
      }
    }
  }
  if (l > n || query(1, l) > s) {
    cout << -1 << endl;
    return 0;
  }
  int head = 0, tail = 0;
  q[tail++] = node(0, 0);
  for (int i = 1; i <= n; i++) dp[i] = INF;
  dp[0] = 0;
  dp[l] = 1;
  for (int i = l + 1; i <= n; i++) {
    int L = 1, R = i - l + 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].first >= dp[i - l]) tail--;
    q[tail++] = node(dp[i - l], i - l);
    if (ans != -1) {
      while (head < tail && q[head].second < ans - 1) head++;
      if (head < tail && q[head].first != INF)
        dp[i] = min(dp[i], q[head].first + 1);
    }
  }
  if (dp[n] == INF) dp[n] = -1;
  cout << dp[n] << endl;
  return 0;
}
