#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005, oo = 1e9;
int f[MAXN];
struct interval_tree {
  int it[MAXN * 4];
  void build(int p, int l, int r) {
    if (l == r)
      it[p] = f[l];
    else {
      int mid = (l + r) >> 1;
      build(p * 2, l, mid);
      build(p * 2 + 1, mid + 1, r);
      it[p] = min(it[p * 2], it[p * 2 + 1]);
    }
  }
  void update(int p, int l, int r, int u, int x) {
    if (l == r)
      it[p] = x;
    else {
      int mid = (l + r) >> 1;
      if (u <= mid)
        update(p * 2, l, mid, u, x);
      else
        update(p * 2 + 1, mid + 1, r, u, x);
      it[p] = min(it[p * 2], it[p * 2 + 1]);
    }
  }
  int query(int p, int l, int r, int u, int v) {
    if (l == u && r == v)
      return it[p];
    else {
      int mid = (l + r) >> 1;
      if (v <= mid)
        return query(p * 2, l, mid, u, v);
      else if (u > mid)
        return query(p * 2 + 1, mid + 1, r, u, v);
      else
        return min(query(p * 2, l, mid, u, mid),
                   query(p * 2 + 1, mid + 1, r, mid + 1, v));
    }
  }
} it;
int a[MAXN];
multiset<int> se;
int n, s, l;
int main() {
  ios::sync_with_stdio(0);
  cin >> n >> s >> l;
  for (int i = 2; i <= n + 1; i++) cin >> a[i], f[i] = 1e9;
  f[1] = 0;
  it.build(1, 1, n + 1);
  for (int i = 2; i <= n + 1; i++) {
    se.insert(a[i]);
    while (!se.empty()) {
      int maxVal = *se.rbegin(), minVal = *se.begin();
      if (maxVal - minVal <= s) break;
      int len = int(se.size());
      multiset<int>::iterator it = se.find(a[i - len + 1]);
      se.erase(it);
    }
    if (int(se.size()) >= l) {
      int le = i - int(se.size()) + 1, ri = i - l + 1;
      int x = it.query(1, 1, n + 1, le - 1, ri - 1);
      if (x == 1e9)
        f[i] = 1e9;
      else
        f[i] = it.query(1, 1, n + 1, le - 1, ri - 1) + 1;
      it.update(1, 1, n + 1, i, f[i]);
    }
  }
  if (f[n + 1] == 1e9)
    cout << "-1\n";
  else
    cout << f[n + 1] << '\n';
  return 0;
}
