#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T mod_v(T num) {
  if (num >= 0)
    return num % 1000000007;
  else
    return (num % 1000000007 + 1000000007) % 1000000007;
}
template <class T>
inline T gcd(T a, T b) {
  a = abs(a);
  b = abs(b);
  while (b) b ^= a ^= b ^= a %= b;
  return a;
}
template <class T>
T fast_pow(T n, T p) {
  if (p == 0) return 1;
  if (p % 2) {
    T g = mod_v(mod_v(n) * mod_v(fast_pow(n, p - 1)));
    return g;
  } else {
    T g = fast_pow(n, p / 2);
    g = mod_v(mod_v(g) * mod_v(g));
    return g;
  }
}
template <class T>
inline T modInverse(T n) {
  return fast_pow(n, 1000000007 - 2LL);
}
bool equalTo(double a, double b) {
  if (fabs(a - b) <= 1e-9)
    return true;
  else
    return false;
}
bool notEqual(double a, double b) {
  if (fabs(a - b) > 1e-9)
    return true;
  else
    return false;
}
bool lessThan(double a, double b) {
  if (a + 1e-9 < b)
    return true;
  else
    return false;
}
bool lessThanEqual(double a, double b) {
  if (a < b + 1e-9)
    return true;
  else
    return false;
}
bool greaterThan(double a, double b) {
  if (a > b + 1e-9)
    return true;
  else
    return false;
}
bool greaterThanEqual(double a, double b) {
  if (a + 1e-9 > b)
    return true;
  else
    return false;
}
template <class T>
inline int in(register T& num) {
  register char c = 0;
  num = 0;
  bool n = false;
  while (c < 33) c = getchar();
  while (c > 33) {
    if (c == '-')
      n = true;
    else
      num = num * 10 + c - '0';
    c = getchar();
  }
  num = n ? -num : num;
  return 1;
}
int kp[200005];
int g[200005];
int dp[200005];
int n, s, l;
int tree[4 * 200005];
int u, v, second;
void update(int nod, int l, int r) {
  if (v < l or r < u) return;
  if (l == r) {
    tree[nod] = second;
    return;
  }
  int mid = (l + r) >> 1;
  int left = nod << 1;
  int right = left | 1;
  update(left, l, mid);
  update(right, mid + 1, r);
  tree[nod] = min(tree[left], tree[right]);
}
void qu(int nod, int l, int r) {
  if (v < l or r < u) return;
  if (u <= l and r <= v) {
    second = min(second, tree[nod]);
    return;
  }
  int mid = (l + r) >> 1;
  int left = nod << 1;
  int right = left | 1;
  qu(left, l, mid);
  qu(right, mid + 1, r);
}
int main() {
  multiset<pair<int, int> > st;
  in(n), in(s), in(l);
  for (int i = 1, j = 1; i <= n; i++) {
    in(kp[i]);
    st.insert({kp[i], i});
    while (!st.empty() and st.rbegin()->first - st.begin()->first > s) {
      st.erase(st.find({kp[j], j}));
      j++;
    }
    g[i] = ((int)st.size());
  }
  for (int i = 1; i <= n; i++) {
    u = i - g[i];
    v = i - l;
    second = 1 << 30;
    if (g[i] >= l) {
      qu(1, 0, n);
    }
    dp[i] = second + 1;
    second = dp[i];
    u = v = i;
    update(1, 0, n);
  }
  cout << (dp[n] >= 1 << 30 ? -1 : dp[n]);
  return 0;
}
