#include <bits/stdc++.h>
void fre() {
  freopen("c://test//input.in", "r", stdin);
  freopen("c://test//output.out", "w", stdout);
}
template <class T>
inline void gmax(T &a, T b) {
  if (b > a) a = b;
}
template <class T>
inline void gmin(T &a, T b) {
  if (b < a) a = b;
}
using namespace std;
const int N = 1e5 + 10, M = 0, Z = 1e9 + 7, maxint = 2147483647,
          ms31 = 522133279, ms63 = 1061109567, ms127 = 2139062143;
const double eps = 1e-8, PI = acos(-1.0);
map<int, int> mop;
struct A {
  int l, r;
  int min, max;
  int w;
} a[1 << 18];
int n, s, l;
int v[N];
void build(int o, int l, int r) {
  a[o].l = l;
  a[o].r = r;
  a[o].w = 1e9;
  if (l == r) {
    a[o].min = a[o].max = v[l];
    return;
  }
  int m = (l + r) >> 1;
  build(o << 1, l, m);
  build(o << 1 | 1, m + 1, r);
  a[o].min = min(a[o << 1].min, a[o << 1 | 1].min);
  a[o].max = max(a[o << 1].max, a[o << 1 | 1].max);
}
int minn, maxx;
void getit(int o, int l, int r) {
  if (a[o].l == l && a[o].r == r) {
    gmax(maxx, a[o].max);
    gmin(minn, a[o].min);
    return;
  }
  int m = (a[o].l + a[o].r) >> 1;
  if (r <= m)
    getit(o << 1, l, r);
  else if (l > m)
    getit(o << 1 | 1, l, r);
  else {
    getit(o << 1, l, m);
    getit(o << 1 | 1, m + 1, r);
  }
}
int findw(int o, int l, int r) {
  if (a[o].l == l && a[o].r == r) {
    return a[o].w;
  }
  int m = (a[o].l + a[o].r) >> 1;
  if (r <= m)
    return findw(o << 1, l, r);
  else if (l > m)
    return findw(o << 1 | 1, l, r);
  else
    return min(findw(o << 1, l, m), findw(o << 1 | 1, m + 1, r));
}
void update(int o, int p, int w) {
  if (a[o].l == a[o].r) {
    a[o].w = w;
    return;
  }
  int m = (a[o].l + a[o].r) >> 1;
  if (p <= m)
    update(o << 1, p, w);
  else
    update(o << 1 | 1, p, w);
  a[o].w = min(a[o << 1].w, a[o << 1 | 1].w);
}
int main() {
  while (~scanf("%d%d%d", &n, &s, &l)) {
    for (int i = 1; i <= n; i++) scanf("%d", &v[i]);
    build(1, 1, n);
    for (int i = l; i <= n; i++) {
      int rgt = i - l + 1;
      int l = 1;
      int r = rgt;
      while (l < r) {
        int m = (l + r) >> 1;
        minn = 1e9 + 10;
        maxx = -1e9 - 10;
        getit(1, m, i);
        if (maxx - minn <= s)
          r = m;
        else
          l = m + 1;
      }
      bool flag = 0;
      if (l < rgt)
        flag = 1;
      else {
        minn = 1e9 + 10;
        maxx = -1e9 - 10;
        getit(1, l, i);
        if (maxx - minn <= s) flag = 1;
      }
      if (flag) {
        int w;
        if (l == 1)
          w = 0;
        else
          w = findw(1, l - 1, rgt - 1);
        if (w < 1e9) update(1, i, w + 1);
      }
    }
    int ans = findw(1, n, n);
    if (ans == 1e9) ans = -1;
    printf("%d\n", ans);
  }
  return 0;
}
