/** author: shobonvip created: 2025.10.29 12:41:29 **/ #include using namespace std; //* ATCODER #include using namespace atcoder; typedef modint998244353 mint; //*/ /* BOOST MULTIPRECISION #include using namespace boost::multiprecision; //*/ typedef long long ll; #define rep(i, s, n) for (int i = (int)(s); i < (int)(n); i++) #define rrep(i, s, n) for (int i = (int)(n)-1; i >= (int)(s); i--) #define all(v) v.begin(), v.end() template bool chmin(T &a, const T &b) { if (a <= b) return false; a = b; return true; } template bool chmax(T &a, const T &b) { if (a >= b) return false; a = b; return true; } template T max(vector &a){ assert(!a.empty()); T ret = a[0]; for (int i=0; i<(int)a.size(); i++) chmax(ret, a[i]); return ret; } template T min(vector &a){ assert(!a.empty()); T ret = a[0]; for (int i=0; i<(int)a.size(); i++) chmin(ret, a[i]); return ret; } template T sum(vector &a){ T ret = 0; for (int i=0; i<(int)a.size(); i++) ret += a[i]; return ret; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n, k; cin >> n >> k; ll d; cin >> d; vector h(n); vector v; v.push_back(ll(-1e18)); rep(i,0,n) { cin >> h[i]; v.push_back(h[i]); v.push_back(h[i]+d); } sort(all(v)); v.erase(unique(all(v)),v.end()); fenwick_tree seg((int)v.size()); vector a(n), b(n); rep(i,0,n) { a[i] = int(lower_bound(all(v),h[i]) - v.begin()); b[i] = int(lower_bound(all(v),h[i] + d) - v.begin()); } rep(i,0,k) { seg.add(0, -1); seg.add(a[i], +1); seg.add(b[i], +1); } vector> lower; vector> upper; rep(i,0,n-k+1) { int ub = (int)v.size()-1; // ok int lb = -1; // ng; while(ub-lb>1){ int t=(ub+lb)/2; if(seg.sum(0,t+1)>=0) { ub=t; }else{ lb=t; } } ll targ = v[ub]; lower.push_back(pair(targ, i)); upper.push_back(pair(targ + d, i)); if (i == n-k) break; seg.add(0, -1); seg.add(a[i+k], +1); seg.add(b[i+k], +1); seg.add(0, +1); seg.add(a[i], -1); seg.add(b[i], -1); } rep(i,0,n) { lower.push_back(pair(h[i], ~i)); upper.push_back(pair(h[i], ~i)); } sort(all(lower)); sort(all(upper)); reverse(all(upper)); vector ans(n-k+1); { fenwick_tree seg2(n); fenwick_tree seg3(n); for (auto [val, i]: lower) { if (i < 0) { i = ~i; seg2.add(i, val); seg3.add(i, 1); } else { ans[i] += seg3.sum(i, i+k) * val - seg2.sum(i, i+k); } } } { fenwick_tree seg2(n); fenwick_tree seg3(n); for (auto [val, i]: upper) { if (i < 0) { i = ~i; seg2.add(i, val); seg3.add(i, 1); } else { ans[i] += - seg3.sum(i, i+k) * val + seg2.sum(i, i+k); } } } cout << min(ans) << '\n'; }