#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 5;
const long long linf = 1e18 + 5;
const int N = 1e5 + 5;
int n, s, l, a[N], dp[N], kd[4 * N], kd_min[4 * N], kd_max[4 * N];
int update(int root, int bas, int son, int x, int val) {
  if (son < x or x < bas) return kd[root];
  if (x <= bas and son <= x) return kd[root] = val;
  return kd[root] = min(
             update((root << 1), bas, ((bas + son) >> 1), x, val),
             update(((root << 1) | 1), ((bas + son) >> 1) + 1, son, x, val));
}
int query(int root, int bas, int son, int x, int y) {
  if (son < x or y < bas or x > y) return inf;
  if (x <= bas and son <= y) return kd[root];
  return min(query((root << 1), bas, ((bas + son) >> 1), x, y),
             query(((root << 1) | 1), ((bas + son) >> 1) + 1, son, x, y));
}
int init_min(int root, int bas, int son) {
  if (bas == son) return kd_min[root] = a[bas];
  int l = init_min((root << 1), bas, ((bas + son) >> 1));
  int r = init_min(((root << 1) | 1), ((bas + son) >> 1) + 1, son);
  return kd_min[root] = min(l, r);
}
int init_max(int root, int bas, int son) {
  if (bas == son) return kd_max[root] = a[bas];
  int l = init_max((root << 1), bas, ((bas + son) >> 1));
  int r = init_max(((root << 1) | 1), ((bas + son) >> 1) + 1, son);
  return kd_max[root] = max(l, r);
}
int get_min(int root, int bas, int son, int x, int y) {
  if (son < x or y < bas) return inf;
  if (x <= bas and son <= y) {
    if (0 and kd_min[root] == 0) cerr << ("root") << " --> " << (root) << '\n';
    return kd_min[root];
  }
  int ret = min(get_min((root << 1), bas, ((bas + son) >> 1), x, y),
                get_min(((root << 1) | 1), ((bas + son) >> 1) + 1, son, x, y));
  if (0)
    cerr << ("bas") << " --> " << (bas) << ' ',
        cerr << ("son") << " --> " << (son) << ' ',
        cerr << ("ret") << " --> " << (ret) << '\n';
  return ret;
}
int get_max(int root, int bas, int son, int x, int y) {
  if (son < x or y < bas) return -inf;
  if (x <= bas and son <= y) return kd_max[root];
  return max(get_max((root << 1), bas, ((bas + son) >> 1), x, y),
             get_max(((root << 1) | 1), ((bas + son) >> 1) + 1, son, x, y));
}
int main() {
  ios ::sync_with_stdio(0);
  cin >> n >> s >> l;
  for (int i = 1; i <= n; i++) cin >> a[i];
  init_min(1, 1, n);
  init_max(1, 1, n);
  cerr << ("get_max(1, 1, n, 4, 7)") << " --> " << (get_max(1, 1, n, 4, 7))
       << '\n';
  cerr << ("get_min(1, 1, n, 4, 7)") << " --> " << (get_min(1, 1, n, 4, 7))
       << '\n';
  for (int i = n; i >= 1; i--) {
    int bas = i, son = n;
    while (bas + 1 < son) {
      if (0)
        cerr << ("bas") << " --> " << (bas) << ' ',
            cerr << ("son") << " --> " << (son) << ' ';
      if (get_max(1, 1, n, i, ((bas + son) >> 1)) -
              get_min(1, 1, n, i, ((bas + son) >> 1)) <=
          s) {
        bas = ((bas + son) >> 1);
        if (0)
          cerr << ("bas") << " --> " << (bas) << ' ',
              cerr << ("son") << " --> " << (son) << '\n';
      } else {
        son = ((bas + son) >> 1) - 1;
        if (0)
          cerr << ("bas") << " --> " << (bas) << ' ',
              cerr << ("son") << " --> " << (son) << '\n';
      }
    }
    if (get_max(1, 1, n, i, son) - get_min(1, 1, n, i, son) > s) son--;
    if (son - i + 1 < l)
      dp[i] = inf;
    else
      dp[i] = query(1, 1, n + 1, i + l, son + 1) + 1;
    update(1, 1, n + 1, i, dp[i]);
    if (0)
      cerr << ("i") << " --> " << (i) << ' ',
          cerr << ("son") << " --> " << (son) << ' ',
          cerr << ("dp[i]") << " --> " << (dp[i]) << '\n';
  }
  if (dp[1] <= n)
    cout << dp[1] << '\n';
  else
    cout << -1 << '\n';
  return 0;
}
