#include <bits/stdc++.h>
using namespace std;
template <typename T>
void showArr(T *arr, int n) {
  for (int i = 0; i < n; i++) cout << arr[i] << ' ';
  puts("");
}
const int MAXP = 100007;
bool NotP[MAXP];
int Prime[MAXP], PrimeCnt;
void CalPrime() {
  memset(NotP, 0, sizeof(NotP));
  PrimeCnt = 0;
  for (int i = 2; i < MAXP; i++)
    if (!NotP[i]) {
      Prime[PrimeCnt++] = i;
      for (int j = i + i; j < MAXP; j += i) NotP[j] = true;
    }
}
long long Gcd(long long a, long long b) {
  if (b == 0LL) return a;
  return Gcd(b, a % b);
}
const int MAXSEG = 100007;
const int MODSEG = 1000000007;
pair<int, int> mxn[MAXSEG << 2];
int v[MAXSEG];
void BuildSegtree(int l, int r, int id) {
  if (l == r) {
    mxn[id].first = v[l];
    mxn[id].second = v[l];
    return;
  }
  int m = (l + r) >> 1;
  BuildSegtree(l, m, id << 1);
  BuildSegtree(m + 1, r, id << 1 | 1);
  mxn[id].first = max(mxn[id << 1].first, mxn[id << 1 | 1].first);
  mxn[id].second = min(mxn[id << 1].second, mxn[id << 1 | 1].second);
}
pair<int, int> QuerySegtree(int l, int r, int id, int ql, int qr) {
  if (ql <= l && qr >= r) {
    auto ret = mxn[id];
    return mxn[id];
  }
  int m = (l + r) >> 1;
  pair<int, int> ret = make_pair(-MODSEG, MODSEG);
  if (ql <= m) {
    auto retl = QuerySegtree(l, m, id << 1, ql, qr);
    ret.first = max(ret.first, retl.first);
    ret.second = min(ret.second, retl.second);
  }
  if (qr > m) {
    auto retr = QuerySegtree(m + 1, r, id << 1 | 1, ql, qr);
    ret.first = max(ret.first, retr.first);
    ret.second = min(ret.second, retr.second);
  }
  return ret;
}
const int MAXN = 100007;
const int MOD = 1000000007;
vector<int> vec[MAXN];
int ans[MAXN];
int main() {
  int n, s, l;
  while (~scanf("%d%d%d", &n, &s, &l)) {
    for (int i = 1; i <= n; i++) scanf("%d", v + i);
    BuildSegtree(1, n, 1);
    memset(ans, -1, sizeof(ans));
    for (int i = 0; i <= n; i++) vec[i].clear();
    auto cal = [&](int v, int p) {
      int pp =
          lower_bound(vec[v].begin(), vec[v].end(), p - l) - vec[v].begin();
      if (pp == vec[v].size() || vec[v][pp] > p - l) pp--;
      if (pp >= 0) {
        auto retp = QuerySegtree(1, n, 1, vec[v][pp] + 1, p);
        if (retp.first - retp.second <= s) {
          ans[p] = v + 1;
        }
      }
    };
    vec[0].push_back(0);
    int now = 0;
    for (int i = 1; i <= n; i++) {
      if (now > 0) cal(now - 1, i);
      if (ans[i] == -1) cal(now, i);
      now = max(now, ans[i]);
      if (ans[i] != -1) vec[ans[i]].push_back(i);
    }
    cout << ans[n] << endl;
  }
  return 0;
}
