#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
int n, s, l;
vector<int> v;
int stdp[400005], stmax[400005], stmin[400005];
void builddp(int node, int l, int r) {
  if (l == r) {
    stdp[node] = 1e9 + 7;
    return;
  }
  int mid = (l + r) / 2;
  builddp(2 * node, l, mid);
  builddp(2 * node + 1, mid + 1, r);
  stdp[node] = min(stdp[2 * node], stdp[2 * node + 1]);
}
void updatedp(int node, int l, int r, int pos, int val) {
  if (l == r) {
    stdp[node] = val;
    return;
  }
  int mid = (l + r) / 2;
  if (pos <= mid)
    updatedp(2 * node, l, mid, pos, val);
  else
    updatedp(2 * node + 1, mid + 1, r, pos, val);
  stdp[node] = min(stdp[2 * node], stdp[2 * node + 1]);
}
int querydp(int node, int l, int r, int x, int y) {
  if (l > y || r < x) return 1e9 + 7;
  if (l >= x && r <= y) return stdp[node];
  int mid = (l + r) / 2;
  int a = querydp(2 * node, l, mid, x, y);
  int b = querydp(2 * node + 1, mid + 1, r, x, y);
  return min(a, b);
}
void buildmax(int node, int l, int r) {
  if (l == r) {
    stmax[node] = v[l];
    return;
  }
  int mid = (l + r) / 2;
  buildmax(2 * node, l, mid);
  buildmax(2 * node + 1, mid + 1, r);
  stmax[node] = max(stmax[2 * node], stmax[2 * node + 1]);
}
int querymax(int node, int l, int r, int x, int y) {
  if (l > y || r < x) return -(1e9 + 7);
  if (l >= x && r <= y) return stmax[node];
  int mid = (l + r) / 2;
  int a = querymax(2 * node, l, mid, x, y);
  int b = querymax(2 * node + 1, mid + 1, r, x, y);
  return max(a, b);
}
void buildmin(int node, int l, int r) {
  if (l == r) {
    stmin[node] = v[l];
    return;
  }
  int mid = (l + r) / 2;
  buildmin(2 * node, l, mid);
  buildmin(2 * node + 1, mid + 1, r);
  stmin[node] = min(stmin[2 * node], stmin[2 * node + 1]);
}
int querymin(int node, int l, int r, int x, int y) {
  if (l > y || r < x) return 1e9 + 7;
  if (l >= x && r <= y) return stmin[node];
  int mid = (l + r) / 2;
  int a = querymin(2 * node, l, mid, x, y);
  int b = querymin(2 * node + 1, mid + 1, r, x, y);
  return min(a, b);
}
int dp[100005];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> s >> l;
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    v.push_back(x);
  }
  builddp(1, 0, n - 1);
  buildmin(1, 0, n - 1);
  buildmax(1, 0, n - 1);
  for (int i = 0; i < n; i++) {
    int wr = i;
    for (int j = 31 - __builtin_clz(i + 1); j >= 0; j--) {
      if ((wr - (1 << j)) >= 0 &&
          querymax(1, 0, n - 1, wr - (1 << j), i) -
                  querymin(1, 0, n - 1, wr - (1 << j), i) <=
              s) {
        wr -= (1 << j);
      }
    }
    if (n - wr + 1 < l) {
      dp[i] = 1e9 + 7;
      continue;
    }
    dp[i] = min((int)1e9 + 7, 1 + querydp(1, 0, n - 1, max(0, wr - 1), i - l));
    if (wr == 0 && i + 1 >= l) dp[i] = 1;
    updatedp(1, 0, n - 1, i, dp[i]);
  }
  if (dp[n - 1] == 1e9 + 7) {
    cout << -1;
  } else {
    cout << dp[n - 1] << '\n';
  }
  return 0;
}
