#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int N = 1e5 + 7;
struct Segment {
  int n;
  vector<int> _max, _min;
  Segment(int n) : n(n) {
    _max = vector<int>(4 * n + 1, INF);
    _min = vector<int>(4 * n + 1, -INF);
  }
  void update_min(int id, int l, int r, int u, int v) {
    if (u < l || r < u) return;
    if (l == r) {
      _min[id] = v;
      return;
    }
    int mid = (l + r) / 2;
    update_min(id << 1, l, mid, u, v);
    update_min(id << 1 | 1, mid + 1, r, u, v);
    _min[id] = min(_min[id << 1], _min[id << 1 | 1]);
  }
  int get_min(int id, int l, int r, int u, int v) {
    if (r < u || v < l) return INF;
    if (u <= l && r <= v) return _min[id];
    int mid = (l + r) / 2;
    return min(get_min(id << 1, l, mid, u, v),
               get_min(id << 1 | 1, mid + 1, r, u, v));
  }
  void update_max(int id, int l, int r, int u, int v) {
    if (u < l || r < u) return;
    if (l == r) {
      _max[id] = v;
      return;
    }
    int mid = (l + r) / 2;
    update_max(id << 1, l, mid, u, v);
    update_max(id << 1 | 1, mid + 1, r, u, v);
    _max[id] = max(_max[id << 1], _max[id << 1 | 1]);
  }
  int get_max(int id, int l, int r, int u, int v) {
    if (r < u || v < l) return -INF;
    if (u <= l && r <= v) return _max[id];
    int mid = (l + r) / 2;
    return max(get_max(id << 1, l, mid, u, v),
               get_max(id << 1 | 1, mid + 1, r, u, v));
  }
};
int main() {
  ios ::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, s, l;
  cin >> n >> s >> l;
  Segment f(n), g(n);
  vector<int> a(n + 1);
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    f.update_max(1, 1, n, i, a[i]);
    f.update_min(1, 1, n, i, a[i]);
  }
  vector<int> b(n + 1);
  int lst = 1;
  for (int i = 1; i <= n; i++) {
    while (lst < i &&
           f.get_max(1, 1, n, lst, i) - f.get_min(1, 1, n, lst, i) > s)
      lst++;
    b[i] = lst;
  }
  vector<int> dp(n + 1, INF);
  dp[0] = 0;
  for (int i = 0; i <= n; i++) {
    g.update_min(1, 0, n, i, dp[i]);
  }
  for (int i = 1; i <= n; i++) {
    if (i - b[i] + 1 < l) continue;
    int _min = g.get_min(1, 0, n, b[i] - 1, i - l);
    dp[i] = _min + 1;
    g.update_min(1, 0, n, i, dp[i]);
  }
  if (dp[n] >= INF)
    cout << -1 << '\n';
  else
    cout << dp[n] << '\n';
  return 0;
}
