#include <bits/stdc++.h>
using namespace std;
const int inf = INT_MAX / 2;
class SparseTable {
 private:
  int lg2(int n) {
    int i = 0;
    while ((1 << i) <= n) {
      ++i;
    }
    return i - 1;
  }

 public:
  vector<vector<int>> MIN;
  vector<vector<int>> MAX;
  vector<int> a;
  vector<int> lg2Result;
  SparseTable(vector<int>& a) {
    int len = a.size();
    lg2Result.assign(len + 1, 0);
    int maxJ = lg2(len) + 1;
    for (int i = 1; i <= len; ++i) {
      lg2Result[i] = lg2(i);
    }
    MIN.resize(len, vector<int>(maxJ + 1, -1));
    MAX.resize(len, vector<int>(maxJ + 1, -1));
    this->a = a;
    for (int i = 0; i <= len - 1; ++i) {
      MIN[i][0] = i;
      MAX[i][0] = i;
    }
    for (int j = 1; j <= maxJ; ++j) {
      for (int i = 0; i <= len - 1; ++i) {
        int front = j - 1;
        int back = i + (1 << (j - 1));
        if (back > len - 1) continue;
        if (a[MIN[i][front]] <= a[MIN[back][front]])
          MIN[i][j] = MIN[i][front];
        else
          MIN[i][j] = MIN[back][front];
        if (a[MAX[i][front]] >= a[MAX[back][front]])
          MAX[i][j] = MAX[i][front];
        else
          MAX[i][j] = MAX[back][front];
      }
    }
  }
  int QueryMin(int i, int j) {
    if (i == j) return MIN[i][0];
    if (i > j) swap(i, j);
    int k = lg2(j - i + 1);
    int front = MIN[i][k];
    int i2 = j - (1 << k) + 1;
    int back = MIN[i2][k];
    if (a[front] <= a[back])
      return front;
    else
      return back;
  }
  int QueryMax(int i, int j) {
    if (i == j) return MAX[i][0];
    if (i > j) swap(i, j);
    int k = lg2(j - i + 1);
    int front = MAX[i][k];
    int i2 = j - (1 << k) + 1;
    int back = MAX[i2][k];
    if (a[front] >= a[back])
      return front;
    else
      return back;
  }
  int Max_Min(int i, int j) {
    if (i == j) return 0;
    if (i > j) swap(i, j);
    int k = lg2(j - i + 1);
    int front = MAX[i][k];
    int i2 = j - (1 << k) + 1;
    int back = MAX[i2][k];
    int maxV = max(a[front], a[back]);
    front = MIN[i][k];
    back = MIN[i2][k];
    int minV = min(a[front], a[back]);
    return maxV - minV;
  }
};
int main() {
  int n, s, l;
  cin >> n >> s >> l;
  vector<int> a(n), dp(n + 1, inf);
  for (int i = 0; i <= n - 1; ++i) {
    cin >> a[i];
  }
  SparseTable st(a);
  int j = 0;
  dp[0] = 0;
  for (int i = 1; i <= n; ++i) {
    while ((i - j >= l && st.Max_Min(j, i - 1) > s) || dp[j] == inf) ++j;
    if (i - j >= l) dp[i] = min(dp[j] + 1, dp[i]);
  }
  if (dp[n] == inf)
    cout << -1 << "\n";
  else
    cout << dp[n] << "\n";
  return 0;
}
