#include <bits/stdc++.h>
using namespace std;
template <typename T>
void read(T &x) {
  x = 0;
  char ch = getchar();
  int fh = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') fh = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x *= fh;
}
template <typename T>
void write(T x) {
  if (x < 0) x = -x, putchar('-');
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
template <typename T>
void writeln(T x) {
  write(x);
  puts("");
}
int n, s, len;
int a[100005];
int dp[100005];
int mn[400005];
int fmn[100005][18], fmx[100005][18];
void pushup(int p) { mn[p] = min(mn[(p << 1)], mn[(p << 1 | 1)]); }
void build(int p, int l, int r) {
  if (l == r) return;
  int mid = l + r >> 1;
  build((p << 1), l, mid);
  build((p << 1 | 1), mid + 1, r);
}
void modify(int p, int l, int r, int x, int k) {
  if (l == r) {
    mn[p] = k;
    return;
  }
  int mid = l + r >> 1;
  if (x <= mid)
    modify((p << 1), l, mid, x, k);
  else
    modify((p << 1 | 1), mid + 1, r, x, k);
  pushup(p);
}
int query(int p, int l, int r, int x, int y) {
  if (x <= l && r <= y) return mn[p];
  int mid = l + r >> 1, res = 1000000007;
  if (x <= mid) res = min(res, query((p << 1), l, mid, x, y));
  if (mid + 1 <= y) res = min(res, query((p << 1 | 1), mid + 1, r, x, y));
  return res;
}
int ask(int l, int r, int op) {
  if (op == 0) {
    int len = r - l + 1;
    int k = log(len) / log(2);
    return min(fmn[l][k], fmn[r - (1 << k) + 1][k]);
  } else {
    int len = r - l + 1;
    int k = log(len) / log(2);
    return max(fmx[l][k], fmx[r - (1 << k) + 1][k]);
  }
}
signed main() {
  read(n);
  read(s);
  read(len);
  for (int i = 1; i <= n; ++i) read(a[i]);
  for (int j = 0; j < 18; ++j)
    for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
      if (!j)
        fmn[i][j] = fmx[i][j] = a[i];
      else {
        fmn[i][j] = min(fmn[i][j - 1], fmn[i + (1 << j - 1)][j - 1]);
        fmx[i][j] = max(fmx[i][j - 1], fmx[i + (1 << j - 1)][j - 1]);
      }
    }
  memset(mn, 0x3f, sizeof(mn));
  build(1, 1, n + 1);
  modify(1, 1, n + 1, 1, 0);
  for (int i = 1; i <= n; ++i) {
    int l = 0, r = i - 1;
    while (l < r) {
      int mid = l + r >> 1;
      if (ask(mid + 1, i, 1) - ask(mid + 1, i, 0) <= s)
        r = mid;
      else
        l = mid + 1;
    }
    r = i - len;
    if (l > r)
      dp[i] = 1000000007;
    else
      dp[i] = query(1, 1, n + 1, l + 1, r + 1) + 1;
    modify(1, 1, n + 1, i + 1, dp[i]);
  }
  writeln((dp[n] > n ? -1 : dp[n]));
  return 0;
}
