#include <bits/stdc++.h>
using namespace std;
long long vec3[17][1 << 17];
long long mn(int i, int j) {
  int p = 31 - __builtin_clz(j - i);
  return min(vec3[p][i], vec3[p][j - (1 << p)]);
}
void mn_init(int n) {
  int mp = 31 - __builtin_clz(n);
  for (int p = 0; p < mp; ++p)
    for (int x = 0; x < n - (1 << p); ++x)
      vec3[p + 1][x] = min(vec3[p][x], vec3[p][x + (1 << p)]);
}
long long vec2[17][1 << 17];
long long mx(int i, int j) {
  int p = 31 - __builtin_clz(j - i);
  return max(vec2[p][i], vec2[p][j - (1 << p)]);
}
void mx_init(int n) {
  int mp = 31 - __builtin_clz(n);
  for (int p = 0; p < mp; ++p)
    for (int x = 0; x < n - (1 << p); ++x)
      vec2[p + 1][x] = max(vec2[p][x], vec2[p][x + (1 << p)]);
}
int izq[100010];
struct rmq {
  int MAX;
  long long vec[4 * 100000];
  long long* init(int n) {
    MAX = 1 << (32 - __builtin_clz(n));
    fill(vec, vec + 2 * MAX, 0);
    return vec + MAX;
  }
  void updall() {
    for (int i = MAX - 1; i >= 0; --i) vec[i] = min(vec[2 * i], vec[2 * i + 1]);
  }
  void pset(int i, long long vl) {
    vec[i += MAX] = vl;
    while (i) {
      i /= 2;
      vec[i] = min(vec[2 * i], vec[2 * i + 1]);
    }
  }
  long long pget(int i, int j) { return _pget(i + MAX, j + MAX); }
  long long _pget(int i, int j) {
    long long res = 100000000;
    if (j - i <= 0) return res;
    if (i % 2) res = min(res, vec[i++]);
    res = min(res, _pget(i / 2, j / 2));
    if (j % 2) res = min(res, vec[--j]);
    return res;
  }
};
rmq DP;
int main() {
  long long n, s, l;
  cin >> n >> s >> l;
  for (int i = 0; i < n; i++) {
    cin >> vec3[0][i];
    vec2[0][i] = vec3[0][i];
  }
  mn_init(n);
  mx_init(n);
  for (int i = 1; i < n; i++) {
    if (mn(0, i) < vec3[0][i] - s) {
      int bot = 0, top = i;
      while (top - bot > 1) {
        int mid = (top + bot) / 2;
        if (mn(mid, i) < vec3[0][i] - s)
          bot = mid;
        else
          top = mid;
      }
      izq[i] = max(izq[i], top);
    }
    if (mx(0, i) > vec3[0][i] + s) {
      int bot = 0, top = i;
      while (top - bot > 1) {
        int mid = (top + bot) / 2;
        if (mx(mid, i) > vec3[0][i] + s)
          bot = mid;
        else
          top = mid;
      }
      izq[i] = max(izq[i], top);
    }
  }
  for (int i = 1; i < n; i++) izq[i] = max(izq[i], izq[i - 1]);
  for (int i = 0; i < n; ++i) izq[i]--;
  long long* v = DP.init(n);
  for (int i = 0; i < n; ++i) v[i] = 100000000;
  DP.updall();
  for (int i = 0; i < n; ++i) {
    if (izq[i] == -1 && i >= l - 1)
      DP.pset(i, 1);
    else {
      DP.pset(i, DP.pget(izq[i], i - l + 1) + 1);
    }
  }
  if (DP.pget(n - 1, n) <= n)
    cout << DP.pget(n - 1, n) << endl;
  else
    cout << -1 << endl;
}
