#include <bits/stdc++.h>
using namespace std;
struct TreeMin {
  int n;
  vector<int> t;
  TreeMin() {}
  TreeMin(int _n) : n(_n), t(2 * n, INT_MAX) {}
  void change(int i, int x) {
    t[i += n] = x;
    for (i >>= 1; i > 0; i >>= 1) {
      t[i] = min(t[2 * i], t[2 * i + 1]);
    }
  }
  int get(int l, int r) {
    int res = INT_MAX;
    for (l += n, r += n; l <= r; l >>= 1, r >>= 1) {
      if (l % 2 == 1) {
        res = min(res, t[l++]);
      }
      if (r % 2 == 0) {
        res = min(res, t[r--]);
      }
    }
    return res;
  }
};
const int N = 1e5 + 10;
int n, s, l;
int a[N];
int t_min[N][20], t_max[N][20];
int two[N];
int dp[N];
void precalc() {
  two[1] = 0;
  for (int i = 2; i <= 1e5; i++) {
    two[i] = 1 + two[i / 2];
  }
  for (int i = 1; i <= n; i++) {
    t_min[i][0] = a[i];
    t_max[i][0] = a[i];
  }
  for (int lvl = 1; (1 << lvl) <= n; lvl++) {
    for (int i = 1; i + (1 << lvl) - 1 <= n; i++) {
      t_min[i][lvl] =
          min(t_min[i][lvl - 1], t_min[i + (1 << (lvl - 1))][lvl - 1]);
      t_max[i][lvl] =
          max(t_max[i][lvl - 1], t_max[i + (1 << (lvl - 1))][lvl - 1]);
    }
  }
}
inline int get_min(int l, int r) {
  int lvl = two[r - l + 1];
  return min(t_min[l][lvl], t_min[r - (1 << lvl) + 1][lvl]);
}
inline int get_max(int l, int r) {
  int lvl = two[r - l + 1];
  return max(t_max[l][lvl], t_max[r - (1 << lvl) + 1][lvl]);
}
inline int get_cnt(int l, int r) { return r - l + 1; }
inline int get_diff(int l, int r) { return get_max(l, r) - get_min(l, r); }
inline bool ok(int i, int j) {
  if (get_cnt(i, j) < l) {
    return false;
  }
  if (get_diff(i, j) > s) {
    return false;
  }
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> s >> l;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  precalc();
  fill(dp + 1, dp + n + 1, INT_MAX);
  TreeMin t(n + 1);
  t.change(1, 0);
  for (int i = 1; i <= n; i++) {
    if (get_cnt(1, i) < l) {
      continue;
    }
    int lf = 1, rg = i - l + 1;
    while (rg - lf > 1) {
      int mid = (lf + rg) / 2;
      if (get_diff(mid, i) <= s) {
        rg = mid;
      } else {
        lf = mid + 1;
      }
    }
    int r;
    if (get_diff(lf, i) <= s) {
      r = lf;
    } else if (get_diff(rg, i) <= s) {
      r = rg;
    } else {
      continue;
    }
    int L = r + 1;
    int R = (i - l + 1) + 1;
    int cur = t.get(L - 1, R - 1);
    if (cur != INT_MAX) {
      dp[i] = 1 + cur;
      t.change(i + 1, dp[i]);
    }
  }
  if (dp[n] == INT_MAX) {
    cout << -1 << "\n";
  } else {
    cout << dp[n] << "\n";
  }
  return 0;
}
