#include <bits/stdc++.h>
using namespace std;
int n, s, l;
long long arr[100009], dp[100009], T[4 * 100009], M[4 * 100009],
    Min[4 * 100009];
void build(int l, int r, int v) {
  if (l == r) {
    T[v] = arr[l];
    M[v] = arr[l];
    Min[v] = 1000000000000000009;
    return;
  }
  build(l, (l + r) / 2, v * 2);
  build((l + r) / 2 + 1, r, v * 2 + 1);
  T[v] = min(T[v * 2], T[v * 2 + 1]);
  M[v] = max(M[v * 2], M[v * 2 + 1]);
  Min[v] = min(Min[v * 2], Min[v * 2 + 1]);
}
pair<long long, long long> tap(int a, int b, int l, int r, int v) {
  if (a <= l && r <= b) return {M[v], T[v]};
  if (l > b || r < a) return {-5LL * 1000000009, 5LL * 1000000009};
  auto mal = tap(a, b, l, (l + r) / 2, v * 2);
  auto cmo = tap(a, b, (l + r) / 2 + 1, r, v * 2 + 1);
  pair<long long, long long> fuc = {max(cmo.first, mal.first),
                                    min(cmo.second, mal.second)};
  return fuc;
}
long long binary_search(int basy, int son) {
  int bok = son;
  auto nah = tap(basy, son, 0, n, 1);
  if (nah.first - nah.second > s) {
    while (basy < son) {
      auto nah = tap((basy + son) / 2, bok, 0, n, 1);
      if (nah.first - nah.second <= s) {
        son = (basy + son) / 2;
      } else
        basy = (basy + son) / 2 + 1;
    }
  }
  return basy;
}
void upd(int x, long long y, int l, int r, int v) {
  if (l == r) {
    Min[v] = y;
    return;
  }
  if (x <= (l + r) / 2)
    upd(x, y, l, (l + r) / 2, v * 2);
  else
    upd(x, y, (l + r) / 2 + 1, r, v * 2 + 1);
  Min[v] = min(Min[v * 2], Min[v * 2 + 1]);
}
long long tap_bilin(int a, int b, int l, int r, int v) {
  if (a <= l && r <= b) return Min[v];
  if (l > b || r < a) return 1000000000000000009;
  return min(tap_bilin(a, b, l, (l + r) / 2, v * 2),
             tap_bilin(a, b, (l + r) / 2 + 1, r, v * 2 + 1));
}
void show_tree(int l, int r, int v) {
  cout << l << " " << r << " " << v << " " << M[v] << endl;
  if (l == r) return;
  show_tree(l, (l + r) / 2, v * 2);
  show_tree((l + r) / 2 + 1, r, v * 2 + 1);
}
int main() {
  cin >> n >> s >> l;
  for (int i = 1; i <= n; i++) scanf("%lld", &arr[i]);
  build(0, n, 1);
  upd(0, 0, 0, n, 1);
  for (int i = 1; i <= n; i++) {
    int x = binary_search(1, i);
    if (i - x + 1 >= l) {
      dp[i] = tap_bilin(i - (i - x + 1), i - l, 0, n, 1) + 1;
      upd(i, dp[i], 0, n, 1);
    }
  }
  if (dp[n] == 0 || dp[n] >= 1000000000000000009) {
    cout << -1;
    return 0;
  }
  cout << dp[n];
  return 0;
}
