#include <bits/stdc++.h>
struct sTree {
  int l, r;
  int pl, pr;
  int val;
} tree[200009];
int treeSize = 0;
int dp[100009];
int BuildTree(int l, int r) {
  int cur = ++treeSize;
  tree[cur].l = l;
  tree[cur].r = r;
  if (l < r) {
    tree[cur].pl = BuildTree(l, (l + r) / 2);
    tree[cur].pr = BuildTree((l + r) / 2 + 1, r);
  }
  return cur;
}
void Set(int i, int cur) {
  if (tree[cur].l == tree[cur].r) {
    tree[cur].val = dp[i];
    return;
  }
  if (i <= tree[tree[cur].pl].r)
    Set(i, tree[cur].pl);
  else
    Set(i, tree[cur].pr);
  tree[cur].val = ((tree[tree[cur].pl].val) < (tree[tree[cur].pr].val)
                       ? (tree[tree[cur].pl].val)
                       : (tree[tree[cur].pr].val));
}
int Get(int l, int r, int cur) {
  if (l <= tree[cur].l && r >= tree[cur].r) return tree[cur].val;
  int tmp = 10000000;
  if (l <= tree[tree[cur].pl].r && tree[tree[cur].pl].l <= r) {
    int t = Get(l, r, tree[cur].pl);
    tmp = ((tmp) < (t) ? (tmp) : (t));
  }
  if (l <= tree[tree[cur].pr].r && tree[tree[cur].pr].l <= r) {
    int t = Get(l, r, tree[cur].pr);
    tmp = ((tmp) < (t) ? (tmp) : (t));
  }
  return tmp;
}
int a[100009];
int Max[100009];
int Min[100009];
int maxL, maxR;
int minL, minR;
int k[100009];
int main() {
  int n, s, l;
  scanf("%d %d %d", &n, &s, &l);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  for (int i = n - 1, j = n - 1; i >= 0; i--) {
    while (maxL < maxR && a[Max[maxR - 1]] < a[i]) maxR--;
    Max[maxR++] = i;
    while (minL < minR && a[Min[minR - 1]] > a[i]) minR--;
    Min[minR++] = i;
    while (a[Max[maxL]] - a[Min[minL]] > s) {
      j--;
      while (maxL < maxR && Max[maxL] > j) maxL++;
      while (minL < minR && Min[minL] > j) minL++;
    }
    k[i] = j;
  }
  int root = BuildTree(0, n);
  for (int i = n - 1; i >= 0; i--) {
    if (i + l > k[i] + 1)
      dp[i] = 100000000;
    else
      dp[i] = Get(i + l, k[i] + 1, root) + 1;
    Set(i, root);
  }
  if (dp[0] > 100000)
    printf("-1");
  else
    printf("%d", dp[0]);
}
