#include <bits/stdc++.h>
const int N = 1e5;
int a[N + 10], f[N + 10], n, l, s;
int mx[N + 10][25], mn[N + 10][25], lg[N + 10];
inline void init() {
  lg[0] = -1;
  for (int i = 1; i <= n; i++) lg[i] = lg[i >> 1] + 1;
  for (int i = 1; i <= n; i++) mx[i][0] = mn[i][0] = a[i];
  for (int j = 1; j <= 20; j++)
    for (int i = 1; i + (1 << j) - 1 <= n; i++) {
      mx[i][j] = std::max(mx[i][j - 1], mx[i + (1 << j - 1)][j - 1]);
      mn[i][j] = std::min(mn[i][j - 1], mn[i + (1 << j - 1)][j - 1]);
    }
}
inline int query(int l, int r) {
  int k = lg[r - l + 1];
  return std::max(mx[l][k], mx[r - (1 << k) + 1][k]) -
         std::min(mn[l][k], mn[r - (1 << k) + 1][k]);
}
int main() {
  scanf("%d%d%d", &n, &s, &l);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  init();
  memset(f, 0x3f, sizeof(f));
  f[0] = 0;
  int pos = 0;
  for (int i = l; i <= n; i++) {
    while (i - pos >= l && (query(pos + 1, i) > s || f[pos] == 0x3f3f3f3f))
      pos++;
    if (i - pos >= l) f[i] = std::min(f[i], f[pos] + 1);
  }
  if (f[n] == 0x3f3f3f3f)
    puts("-1");
  else
    printf("%d\n", f[n]);
  return 0;
}
