#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
const int maxn5 = 5e5 + 10;
const int maxn3 = 1e3 + 10;
const long long mod = 1e9 + 7;
const long long inf = 2e18;
int mn[24][maxn5], mx[24][maxn5], a[maxn5], dp[maxn5];
long long ans[maxn5];
deque<int> q;
int get_min(int l, int r) {
  int k = 31 - __builtin_clz(r - l + 1);
  return min(mn[k][l], mn[k][r - (1 << k) + 1]);
}
int get_max(int l, int r) {
  int k = 31 - __builtin_clz(r - l + 1);
  return max(mx[k][l], mx[k][r - (1 << k) + 1]);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, l;
  long long s;
  cin >> n >> s >> l;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    mn[0][i] = a[i];
    mx[0][i] = a[i];
  }
  for (int i = 1; i < 20; i++) {
    for (int j = 0; j < n and (j + (1 << i) - 1) < n; j++) {
      mn[i][j] = min(mn[i - 1][j], mn[i - 1][j + (1 << (i - 1))]);
      mx[i][j] = max(mx[i - 1][j], mx[i - 1][j + (1 << (i - 1))]);
    }
  }
  int last = 0;
  for (int i = 0; i < n; i++) {
    while (get_max(last, i) - get_min(last, i) > s) last++;
    dp[i] = last;
  }
  q.push_front(-1);
  for (int i = 0; i < l - 1; i++) ans[i] = inf;
  for (int i = l - 1; i < n; i++) {
    while (!q.empty() and q.front() + 1 < dp[i]) q.pop_front();
    if (q.empty())
      ans[i] = inf;
    else
      ans[i] = q.front() == -1 ? 1 : ans[q.front()] + 1;
    int v = i - l + 1;
    while (!q.empty() and (q.back() == -1 ? 0 : ans[q.back()]) > ans[v]) {
      q.pop_back();
    }
    q.push_back(v);
  }
  cout << (ans[n - 1] >= inf ? -1 : ans[n - 1]) << endl;
  return 0;
}
