#include <bits/stdc++.h>
using namespace std;
int N, S, L;
int A[100002];
int mn[100002 * 4], lz[100002 * 4];
int minval[100002 * 4], maxval[100002 * 4];
void build(int node, int left, int right) {
  mn[node] = lz[node] = 100002;
  if (left != right) {
    int m = (left + right) / 2;
    build(node * 2, left, m);
    build(node * 2 + 1, m + 1, right);
    minval[node] = min(minval[node * 2], minval[node * 2 + 1]);
    maxval[node] = max(maxval[node * 2], maxval[node * 2 + 1]);
  } else {
    minval[node] = maxval[node] = A[left];
  }
}
void push(int node, int left, int right) {
  mn[node] = min(mn[node], lz[node]);
  if (left != right) {
    lz[node * 2] = min(lz[node * 2], lz[node]);
    lz[node * 2 + 1] = min(lz[node * 2 + 1], lz[node]);
  }
  lz[node] = 100002;
}
void upd(int node, int left, int right, int l, int r, int v) {
  push(node, left, right);
  if (r < l) return;
  if (r < left || right < l) return;
  if (l <= left && right <= r) {
    lz[node] = min(lz[node], v);
    push(node, left, right);
    return;
  }
  int m = (left + right) / 2;
  upd(node * 2, left, m, l, min(r, m), v);
  upd(node * 2 + 1, m + 1, right, max(m + 1, l), r, v);
  mn[node] = min(mn[node * 2], mn[node * 2 + 1]);
}
int query(int node, int left, int right, int idx) {
  push(node, left, right);
  if (left == right) {
    return mn[node];
  }
  int m = (left + right) / 2;
  if (idx <= m) return query(node * 2, left, m, idx);
  return query(node * 2 + 1, m + 1, right, idx);
}
pair<int, int> getminmax(int node, int left, int right, int l, int r) {
  if (r < l) return {1e9 + 1, -1e9 - 1};
  if (r < left || right < l) return {1e9 + 1, -1e9 - 1};
  if (l <= left && right <= r) return {minval[node], maxval[node]};
  int m = (left + right) / 2;
  auto valleft = getminmax(node * 2, left, m, l, min(r, m));
  auto valright = getminmax(node * 2 + 1, m + 1, right, max(m + 1, l), r);
  return {min(valleft.first, valright.first),
          max(valleft.second, valright.second)};
}
int main(int argc, char **argv) {
  scanf("%d%d%d", &N, &S, &L);
  for (int i = 0; i < N; i++) scanf("%d", &A[i]);
  build(1, 0, N - 1);
  for (int i = 0; i < N; i++) {
    int lst = 0;
    if (i) lst = query(1, 0, N - 1, i - 1);
    if (lst == 100002) continue;
    int l = min(i + L - 1, N - 1), r = N;
    auto val = getminmax(1, 0, N - 1, i, l);
    if (val.second - val.first > S) continue;
    while (r - l > 1) {
      int m = (l + r) / 2;
      val = getminmax(1, 0, N - 1, i, m);
      if (val.second - val.first > S)
        r = m;
      else
        l = m;
    }
    upd(1, 0, N - 1, i + L - 1, l, lst + 1);
  }
  int ans = query(1, 0, N - 1, N - 1);
  if (ans == 100002) ans = -1;
  printf("%d\n", ans);
  return 0;
}
