#include <bits/stdc++.h>
using namespace std;
inline long long getnum() {
  char c = getchar();
  long long num, sign = 1;
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') sign = -1;
  for (num = 0; c >= '0' && c <= '9';) {
    c -= '0';
    num = num * 10 + c;
    c = getchar();
  }
  return num * sign;
}
int Pow[22], lg[100005];
int MaxTree[22][100005];
int MinTree[22][100005];
int A[100005];
int R[100005];
int Tree[100005 * 8];
void update(int l, int r, int ind, int p, int val) {
  Tree[ind] = min(Tree[ind], val);
  if (l == r) return;
  int m = (l + r) / 2;
  if (p <= m)
    update(l, m, 2 * ind, p, val);
  else
    update(m + 1, r, 2 * ind + 1, p, val);
}
int getdp(int l, int r, int ind, int lx, int rx) {
  if (lx == l && rx == r) return Tree[ind];
  int m = (l + r) / 2;
  if (rx <= m)
    return getdp(l, m, 2 * ind, lx, rx);
  else if (lx > m)
    return getdp(m + 1, r, 2 * ind + 1, lx, rx);
  else
    return min(getdp(l, m, 2 * ind, lx, m),
               getdp(m + 1, r, 2 * ind + 1, m + 1, rx));
}
int getmax(int l, int r) {
  int p = lg[r - l + 1];
  return max(MaxTree[p][l], MaxTree[p][r - Pow[p] + 1]);
}
int getmin(int l, int r) {
  int p = lg[r - l + 1];
  return min(MinTree[p][l], MinTree[p][r - Pow[p] + 1]);
}
int main() {
  Pow[0] = 1;
  for (int i = 1; i <= 20; i++) Pow[i] = 2 * Pow[i - 1];
  lg[1] = 0;
  for (int i = 2, j = 0; i <= 100002; i++) {
    if (i > Pow[j]) j++;
    lg[i] = j - 1;
  }
  int n = getnum(), s = getnum(), lt = getnum();
  for (int i = 1; i <= n; i++) A[i] = getnum();
  for (int i = 1; i <= n; i++) MaxTree[0][i] = A[i];
  for (int p = 1; p <= 20; p++) {
    for (int i = 1; i <= n; i++) {
      if (Pow[p - 1] + i > n)
        MaxTree[p][i] = MaxTree[p - 1][i];
      else
        MaxTree[p][i] = max(MaxTree[p - 1][i], MaxTree[p - 1][i + Pow[p - 1]]);
    }
  }
  for (int i = 1; i <= n; i++) MinTree[0][i] = A[i];
  for (int p = 1; p <= 20; p++) {
    for (int i = 1; i <= n; i++) {
      if (Pow[p - 1] + i > n)
        MinTree[p][i] = MinTree[p - 1][i];
      else
        MinTree[p][i] = min(MinTree[p - 1][i], MinTree[p - 1][i + Pow[p - 1]]);
    }
  }
  for (int i = 1; i <= n; i++) {
    int l = i, r = n;
    while (l < r) {
      int m = (l + r) / 2 + (l + r) % 2;
      int mx = getmax(i, m);
      int mn = getmin(i, m);
      if (mx - mn <= s)
        l = m;
      else
        r = m - 1;
    }
    R[i] = l + 1;
  }
  for (int i = 1; i <= 8 * n; i++) Tree[i] = n * 2;
  update(1, 2 * n, 1, n + 1, 0);
  int ans;
  for (int i = n; i >= 1; i--) {
    if (R[i] < i + lt) {
      ans = 2 * n;
      continue;
    }
    ans = getdp(1, 2 * n, 1, i + lt, R[i]) + 1;
    update(1, 2 * n, 1, i, ans);
  }
  if (ans > n) ans = -1;
  cout << ans << endl;
}
