#include #include using namespace std; using ll = long long; constexpr int INF = 1 << 29; int main() { ios::sync_with_stdio(false); cin.tie(0); ll n, k, d; cin >> n >> k >> d; vector a(n), c; for(auto &&v : a) cin >> v; c = a; sort(c.begin(), c.end()); atcoder::fenwick_tree fw1(n), fw2(n); multiset L, M, R; auto add = [&](ll p, int v){ int pos = lower_bound(c.begin(), c.end(), p) - c.begin(); fw1.add(pos, v); fw2.add(pos, v * p); }; auto update = [&](){ if(!M.empty()){ while(true){ ll mn = *M.begin(); ll mx = *M.rbegin(); if(mx - mn > d){ if(L.size() < R.size()){ L.insert(mn); M.erase(M.find(mn)); add(mn, 1); }else{ R.insert(mx); M.erase(M.find(mx)); add(mx, 1); } }else{ break; } } } while(L.size() >= R.size() + 2){ ll v = *L.rbegin(); L.erase(L.find(v)); add(v, -1); M.insert(v); while(true){ ll mn = *M.begin(); ll mx = *M.rbegin(); if(mx - mn > d){ R.insert(mx); M.erase(M.find(mx)); add(mx, 1); }else{ break; } } } while(R.size() >= L.size() + 2){ ll v = *R.begin(); R.erase(R.find(v)); add(v, -1); M.insert(v); while(true){ ll mn = *M.begin(); ll mx = *M.rbegin(); if(mx - mn > d){ L.insert(mn); M.erase(M.find(mn)); add(mn, 1); }else{ break; } } } }; ll ans = 1ll << 60; for(int i = 0; i < n; i++){ M.insert(a[i]); if(i >= k){ if(L.find(a[i - k]) != L.end()){ L.erase(L.find(a[i - k])); add(a[i - k], -1); }else if(M.find(a[i - k]) != M.end()){ M.erase(M.find(a[i - k])); }else{ R.erase(R.find(a[i - k])); add(a[i - k], -1); } } update(); if(i >= k - 1){ ll mn = *M.begin(); ll mx = max(*M.rbegin(), mn + d); int lp = lower_bound(c.begin(), c.end(), mn) - c.begin(); int rp = lower_bound(c.begin(), c.end(), mx) - c.begin(); ans = min(ans, mn * fw1.sum(0, lp) - fw2.sum(0, lp) + fw2.sum(rp, n) - fw1.sum(rp, n) * mx); mx = *M.rbegin(); mn = mx - d; lp = lower_bound(c.begin(), c.end(), mn) - c.begin(); rp = lower_bound(c.begin(), c.end(), mx) - c.begin(); ans = min(ans, mn * fw1.sum(0, lp) - fw2.sum(0, lp) + fw2.sum(rp, n) - fw1.sum(rp, n) * mx); } } cout << ans << '\n'; }