#include <bits/stdc++.h>
using namespace std;
const int MaxN = 1e5;
const int INF = 1e9;
int a[MaxN];
int dp[MaxN];
int tMin[4 * MaxN], tMax[4 * MaxN], tMinDp[4 * MaxN];
void build(int v, int tl, int tr) {
  if (tl == tr) {
    tMin[v] = tMax[v] = a[tl];
    tMinDp[v] = INF;
  } else {
    int mid = (tl + tr) / 2;
    build(v * 2, tl, mid);
    build(v * 2 + 1, mid + 1, tr);
    tMin[v] = min(tMin[v * 2], tMin[v * 2 + 1]);
    tMax[v] = max(tMax[v * 2], tMax[v * 2 + 1]);
    tMinDp[v] = min(tMinDp[v * 2], tMinDp[v * 2 + 1]);
  }
}
int getMax(int v, int tl, int tr, int l, int r) {
  if (l > r) return -INF;
  if (l == tl && r == tr)
    return tMax[v];
  else {
    int mid = (tl + tr) / 2;
    return max(getMax(v * 2, tl, mid, l, min(r, mid)),
               getMax(v * 2 + 1, mid + 1, tr, max(l, mid + 1), r));
  }
}
int getMin(int v, int tl, int tr, int l, int r) {
  if (l > r) return INF;
  if (l == tl && r == tr)
    return tMin[v];
  else {
    int mid = (tl + tr) / 2;
    return min(getMin(v * 2, tl, mid, l, min(r, mid)),
               getMin(v * 2 + 1, mid + 1, tr, max(l, mid + 1), r));
  }
}
int getMinDp(int v, int tl, int tr, int l, int r) {
  if (l > r) return INF;
  if (l == tl && r == tr)
    return tMinDp[v];
  else {
    int mid = (tl + tr) / 2;
    return min(getMinDp(v * 2, tl, mid, l, min(r, mid)),
               getMinDp(v * 2 + 1, mid + 1, tr, max(l, mid + 1), r));
  }
}
void updateDp(int v, int tl, int tr, int pos, int val) {
  if (tl == tr) {
    tMinDp[v] = val;
  } else {
    int mid = (tl + tr) / 2;
    if (pos <= mid)
      updateDp(v * 2, tl, mid, pos, val);
    else
      updateDp(v * 2 + 1, mid + 1, tr, pos, val);
    tMinDp[v] = min(tMinDp[v * 2], tMinDp[v * 2 + 1]);
  }
}
int getDif(int v, int tl, int tr, int l, int r) {
  return getMax(v, tl, tr, l, r) - getMin(v, tl, tr, l, r);
}
int findMinPos(int rPos, int sum, int n) {
  int l = 0, r = rPos;
  if (getDif(1, 0, n - 1, l, rPos) <= sum)
    return l;
  else {
    while (l < r - 1) {
      int mid = (l + r) / 2;
      if (getDif(1, 0, n - 1, mid, rPos) <= sum)
        r = mid;
      else
        l = mid;
    }
    return r;
  }
}
int main() {
  int n, l, s;
  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 < l; i++) dp[i] = INF;
  for (int i = l - 1; i < n; i++) {
    int maxPos = i - l + 1;
    int minPos = findMinPos(i, s, n);
    if (minPos > maxPos)
      dp[i] = INF;
    else {
      dp[i] =
          min(INF, 1 + getMinDp(1, 0, n - 1, max(minPos - 1, 0), maxPos - 1));
      if (minPos == 0) dp[i] = min(dp[i], 1);
      updateDp(1, 0, n - 1, i, dp[i]);
    }
  }
  if (dp[n - 1] == INF)
    printf("-1");
  else
    printf("%d", dp[n - 1]);
}
