#include <bits/stdc++.h>
using namespace std;
int n, s, l, x, v, a, b, g[100001], _min, _max, temp[100001], f[100001];
struct SegmentTree {
  int xmin[400001], xmax[400001];
  void update(int o, int l, int r) {
    if (l == r) {
      xmin[o] = xmax[o] = v;
      return;
    }
    int m = (l + r) / 2;
    if (x <= m)
      update(o * 2, l, m);
    else
      update(o * 2 + 1, m + 1, r);
    xmin[o] = min(xmin[o * 2], xmin[o * 2 + 1]);
    xmax[o] = max(xmax[o * 2], xmax[o * 2 + 1]);
  }
  void query(int o, int l, int r) {
    if (a <= l && r <= b) {
      _min = min(_min, xmin[o]);
      _max = max(_max, xmax[o]);
      return;
    }
    int m = (l + r) / 2;
    if (a <= m) query(o * 2, l, m);
    if (b > m) query(o * 2 + 1, m + 1, r);
  }
} tf, tg;
int main() {
  scanf("%d%d%d", &n, &s, &l);
  for (x = 1; x <= n; x++) {
    scanf("%d", &temp[x]);
    v = temp[x];
    tg.update(1, 1, n);
  }
  for (int i = 1; i <= n; i++) {
    int l = 1, r = i, mid;
    b = i;
    while (l <= r) {
      mid = (l + r) >> 1;
      _min = 2000000000;
      _max = -2000000000;
      a = mid;
      tg.query(1, 1, n);
      if (_max - _min > s)
        l = mid + 1;
      else
        r = mid - 1;
    }
    g[i] = i - r;
  }
  x = 0;
  v = 0;
  tf.update(1, 1, n);
  v = 2000000000;
  for (x = 1; x <= n; x++) tf.update(1, 1, n);
  for (int i = l; i <= n; i++) {
    a = i - g[i], b = i - l;
    _min = 2000000000;
    _max = 0;
    if (a <= b) {
      if (a == 0 || b == 0) {
        f[i] = 1;
        x = i;
        v = 1;
        tf.update(1, 1, n);
        continue;
      }
      tf.query(1, 1, n);
      f[i] = _min + 1;
    } else
      f[i] = 2000000000;
    x = i;
    v = _min + 1;
    tf.update(1, 1, n);
  }
  if (f[n] <= n / l && f[n])
    printf("%d", f[n]);
  else
    printf("-1");
  return 0;
}
