#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100000;
const int MAX_E2 = 1 << 18;
const int INF = 1 << 30;
template <typename T, const int MAX_E2>
struct SegTreeMin {
  int e2;
  T nodes[MAX_E2], minv;
  SegTreeMin() {}
  void init(int n, T _minv) {
    minv = _minv;
    for (e2 = 1; e2 < n; e2 <<= 1)
      ;
    fill(nodes, nodes + MAX_E2, minv);
  }
  T &get(int i) { return nodes[e2 - 1 + i]; }
  void set(int i, T v) {
    int j = e2 - 1 + i;
    nodes[j] = v;
    while (j > 0) {
      j = (j - 1) / 2;
      nodes[j] = min(nodes[j * 2 + 1], nodes[j * 2 + 2]);
    }
  }
  T min_range(int r0, int r1, int k, int i0, int i1) {
    if (r1 <= i0 || i1 <= r0) return minv;
    if (r0 <= i0 && i1 <= r1) return nodes[k];
    int im = (i0 + i1) / 2;
    T v0 = min_range(r0, r1, k * 2 + 1, i0, im);
    T v1 = min_range(r0, r1, k * 2 + 2, im, i1);
    return min(v0, v1);
  }
  T min_range(int r0, int r1) { return min_range(r0, r1, 0, 0, e2); }
};
int as[MAX_N], aq[MAX_N], dq[MAX_N];
SegTreeMin<int, MAX_E2> st;
void printq(int *q, int *qt) {
  while (q < qt) printf(" %d[%d]", as[*q], *q), q++;
  putchar('\n');
}
int main() {
  int n, s, l;
  scanf("%d%d%d", &n, &s, &l);
  for (int i = 0; i < n; i++) scanf("%d", as + i);
  st.init(n + 1, INF);
  st.set(0, 0);
  int *aqt = aq, *dqt = dq;
  for (int i = 0; i < n; i++) {
    while (aq < aqt && as[*(aqt - 1)] > as[i]) aqt--;
    while (dq < dqt && as[*(dqt - 1)] < as[i]) dqt--;
    *(aqt++) = *(dqt++) = i;
    int j0 = -1, j1 = i;
    while (j0 + 1 < j1) {
      int j = (j0 + j1) / 2;
      int *aj = lower_bound(aq, aqt, j);
      int *dj = lower_bound(dq, dqt, j);
      if (as[*dj] - as[*aj] <= s)
        j1 = j;
      else
        j0 = j;
    }
    int j2 = i + 1 - (l - 1);
    if (j1 < j2) {
      int v = st.min_range(j1, j2);
      if (v < INF) st.set(i + 1, v + 1);
    }
  }
  int v = st.get(n);
  printf("%d\n", (v < INF) ? v : -1);
  return 0;
}
