#include <bits/stdc++.h>   using namespace std;   long long vec3[17][1 << 17];   long long mn(int i, int j) {     int p = 31 - __builtin_clz(j - i);     return min(vec3[p][i], vec3[p][j - (1 << p)]);   }   void mn_init(int n) {     int mp = 31 - __builtin_clz(n);     for (int p = 0; p < mp; ++p)       for (int x = 0; x < n - (1 << p); ++x)         vec3[p + 1][x] = min(vec3[p][x], vec3[p][x + (1 << p)]);   }   long long vec2[17][1 << 17];   long long mx(int i, int j) {     int p = 31 - __builtin_clz(j - i);     return max(vec2[p][i], vec2[p][j - (1 << p)]);   }   void mx_init(int n) {     int mp = 31 - __builtin_clz(n);     for (int p = 0; p < mp; ++p)       for (int x = 0; x < n - (1 << p); ++x)         vec2[p + 1][x] = max(vec2[p][x], vec2[p][x + (1 << p)]);   }   int izq[100010];   struct rmq {     int MAX;     long long vec[4 * 100000];     long long* init(int n) {       MAX = 1 << (32 - __builtin_clz(n));       fill(vec, vec + 2 * MAX, 0);       return vec + MAX;     }     void updall() {       for (int i = MAX - 1; i >= 0; --i) vec[i] = min(vec[2 * i], vec[2 * i + 1]);     }     void pset(int i, long long vl) {       vec[i += MAX] = vl;       while (i) {         i /= 2;         vec[i] = min(vec[2 * i], vec[2 * i + 1]);       }     }     long long pget(int i, int j) { return _pget(i + MAX, j + MAX); }     long long _pget(int i, int j) {       long long res = 100000000;       if (j - i <= 0) return res;       if (i % 2) res = min(res, vec[i++]);       res = min(res, _pget(i / 2, j / 2));       if (j % 2) res = min(res, vec[--j]);       return res;     }   };   rmq DP;   int main() {     long long n, s, l;     cin >> n >> s >> l;     for (int i = 0; i < n; i++) {       cin >> vec3[0][i];       vec2[0][i] = vec3[0][i];     }     mn_init(n);     mx_init(n);     for (int i = 1; i < n; i++) {       if (mn(0, i) < vec3[0][i] - s) {         int bot = 0, top = i;         while (top - bot > 1) {           int mid = (top + bot) / 2;           if (mn(mid, i) < vec3[0][i] - s)             bot = mid;           else             top = mid;         }         izq[i] = max(izq[i], top);       }       if (mx(0, i) > vec3[0][i] + s) {         int bot = 0, top = i;         while (top - bot > 1) {           int mid = (top + bot) / 2;           if (mx(mid, i) > vec3[0][i] + s)             bot = mid;           else             top = mid;         }         izq[i] = max(izq[i], top);       }     }     for (int i = 1; i < n; i++) izq[i] = max(izq[i], izq[i - 1]);     for (int i = 0; i < n; ++i) izq[i]--;     long long* v = DP.init(n);     for (int i = 0; i < n; ++i) v[i] = 100000000;     DP.updall();     for (int i = 0; i < n; ++i) {       if (izq[i] == -1 && i >= l - 1)         DP.pset(i, 1);       else {         DP.pset(i, DP.pget(izq[i], i - l + 1) + 1);       }     }     if (DP.pget(n - 1, n) <= n)       cout << DP.pget(n - 1, n) << endl;     else       cout << -1 << endl;   }   