#include <bits/stdc++.h>
using namespace std;
deque<int> a, mn, mx;
int iter = 0;
void push(int x) {
  a.push_back(x);
  while (mn.size() > 0 && mn.back() > x) mn.pop_back();
  while (mx.size() > 0 && mx.back() < x) mx.pop_back();
  mn.push_back(x);
  mx.push_back(x);
}
void pop() {
  if (mn.size() > 0 && mn.front() == a.front()) mn.pop_front();
  if (mx.size() > 0 && mx.front() == a.front()) mx.pop_front();
  a.pop_front();
  ++iter;
}
int Min() { return mn.front(); }
int Max() { return mx.front(); }
const int MAXN = 100010;
int N, A[MAXN];
int prv[MAXN];
int S, L;
int dp[MAXN];
int main(void) {
  scanf("%d%d%d", &N, &S, &L);
  for (int i = 0; i < N; ++i) {
    scanf("%d", &A[i]);
    push(A[i]);
    while (a.size() > 0 && Max() - Min() > S) {
      pop();
    }
    prv[i] = iter - 1;
  }
  memset(dp, 0x3f3f3f3f, sizeof dp);
  while (a.size() > 0) pop();
  push(0x3f3f3f3f);
  int it = 0;
  for (int i = 0; i < N; ++i) {
    if (i - L >= 0) push(dp[i - L]);
    while (it <= prv[i] && a.size() > 1) {
      pop();
      ++it;
    }
    if (i - prv[i] < L) continue;
    if (prv[i] < 0)
      dp[i] = 1;
    else
      dp[i] = Min() + 1;
  }
  if (dp[N - 1] > N)
    printf("-1\n");
  else
    printf("%d\n", dp[N - 1]);
  return 0;
}
