#include <bits/stdc++.h>
using namespace std;
struct edge {
  long long mx, mn;
};
long long arr[100005];
int dptree[400005];
struct edge tree[4 * 100005];
int l, n, limit;
void build(int node, int a, int b) {
  if (a == b) {
    tree[node].mx = arr[a];
    tree[node].mn = arr[a];
    return;
  }
  int mid = (a + b) >> 1;
  build((node << 1), a, mid);
  build((node << 1) | 1, mid + 1, b);
  tree[node].mx = max(tree[(node << 1)].mx, tree[(node << 1) | 1].mx);
  tree[node].mn = min(tree[(node << 1)].mn, tree[(node << 1) | 1].mn);
}
struct edge query(int node, int a, int b, int i, int j) {
  if (a >= i && b <= j) return tree[node];
  int mid = (a + b) >> 1;
  if (j <= mid)
    return query((node << 1), a, mid, i, j);
  else if (i > mid)
    return query((node << 1) | 1, mid + 1, b, i, j);
  else {
    struct edge p1, p2, p;
    p1 = query((node << 1), a, mid, i, j);
    p2 = query((node << 1) | 1, mid + 1, b, i, j);
    p.mx = max(p1.mx, p2.mx);
    p.mn = min(p1.mn, p2.mn);
    return p;
  }
}
int dpquery(int node, int a, int b, int i, int j) {
  if (a >= i && b <= j) return dptree[node];
  int mid = (a + b) >> 1;
  if (j <= mid)
    return dpquery((node << 1), a, mid, i, j);
  else if (i > mid)
    return dpquery((node << 1) | 1, mid + 1, b, i, j);
  else
    return min(dpquery((node << 1), a, mid, i, j),
               dpquery((node << 1) | 1, mid + 1, b, i, j));
}
void update(int node, int a, int b, int i, int v) {
  if (a == b) {
    dptree[node] = v;
    return;
  }
  int mid = (a + b) >> 1;
  if (i <= mid)
    update((node << 1), a, mid, i, v);
  else
    update((node << 1) | 1, mid + 1, b, i, v);
  dptree[node] = min(dptree[(node << 1)], dptree[(node << 1) | 1]);
}
int bin_search(int v, int i, int j) {
  if (i >= j) return j;
  int mid = ceil((i + j) / 2.0);
  struct edge tmp = query(1, 0, n - 1, v, mid);
  if (tmp.mx - tmp.mn <= limit)
    return bin_search(v, mid, j);
  else
    return bin_search(v, i, mid - 1);
}
int till[100005];
int dp[100005];
int main() {
  int i;
  scanf("%d", &n);
  scanf("%d", &limit);
  scanf("%d", &l);
  for (i = 0; i < n; i++) {
    scanf("%I64d", &arr[i]);
  }
  build(1, 0, n - 1);
  for (i = 0; i < n; i++) {
    till[i] = bin_search(i, i, n - 1);
  }
  fill(dptree, dptree + 4 * n, 1000000007);
  update(1, 0, n, n, 0);
  for (i = n - 1; i >= 0; i--) {
    int fr = i + l;
    int to = till[i] + 1;
    if (fr > to)
      dp[i] = 1000000007;
    else {
      dp[i] = 1 + dpquery(1, 0, n, fr, to);
      update(1, 0, n, i, dp[i]);
    }
  }
  if (dp[0] < 1000000007)
    printf("%d\n", dp[0]);
  else
    printf("-1\n");
  return 0;
}
