#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
// - Bài toán 1: Cho dãy a gồm n phần tử, mỗi thao tác được tăng/giảm một phần tử bất kì (x = x - 1 hoặc x = x + 1)
// Tính số thao tác ít nhất để tất cả n phần tử bằng nhau?
// - Hay nói cách khác, cần tìm x để cực tiểu hoá tổng |a(i) - x|
// => Đáp án: x là trung vị (median) của a
// - Áp dụng vào bài này, nhiệm vụ của ta là với mỗi đoạn k phần tử, cần tìm được phần tử trung vị (median),
// tổng và số lượng phần tử <= med, tổng và số lượng phần tử > med
// - Ở đây có nhiều cách xử lí offline (Fenwick Tree,...), nhưng có cách làm online kinh điển:
// - Để ý rằng median chính là phần tử nằm ở chính giữa mảng sau khi sort nên ở đây ta có thể duy trì 2 multiset lo, hi
// - multiset lo sẽ là tập các phần tử nằm ở nửa trái (<= med), cùng với sum_lo để lưu tổng
// multiset hi sẽ là tập các phần tử nằm ở nửa phải (> med), cùng với sum_hi để lưu tổng
// - Ta sẽ luôn giữ cho 2 multiset lo, hi được cân bằng:
// lo.size() >= hi.size() và |lo.size() - hi.size()| <= 1
// Suy ra hi.size() <= lo.size() <= hi.size() + 1
// - Khi đó, phần tử trung vị chính là *lo.rbegin()
// - Mỗi khi thêm, xoá phần tử thì ta sẽ gọi hàm rebalance() để tái cân bằng theo điều kiện trên
const int N = 2e5 + 5;
int n, k;
int a[N];
multiset<int> lo, hi;
ll sum_lo = 0, sum_hi = 0;
void rebalance() {
while (lo.size() < hi.size()) {
int x = *hi.begin(); hi.erase(hi.find(x));
sum_hi -= x;
lo.insert(x);
sum_lo += x;
}
while (lo.size() > hi.size() + 1) {
int x = *prev(lo.end()); lo.erase(lo.find(x));
sum_lo -= x;
hi.insert(x);
sum_hi += x;
}
}
void add(int x) {
if (lo.empty() || x <= *lo.rbegin()) {
lo.insert(x);
sum_lo += x;
}
else {
hi.insert(x);
sum_hi += x;
}
rebalance();
}
void remove(int x) {
if (lo.find(x) != lo.end()) {
lo.erase(lo.find(x));
sum_lo -= x;
}
else {
hi.erase(hi.find(x));
sum_hi -= x;
}
rebalance();
}
ll getCost() {
ll med = *lo.rbegin();
ll cost = (med * (ll)lo.size() - sum_lo) + (sum_hi - med * (ll)hi.size());
return cost;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= k; i++) add(a[i]);
cout << getCost() << ' ';
for (int i = k + 1; i <= n; i++) {
add(a[i]);
remove(a[i - k]);
cout << getCost() << ' ';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKLy8gLSBCw6BpIHRvw6FuIDE6IENobyBkw6N5IGEgZ+G7k20gbiBwaOG6p24gdOG7rSwgbeG7l2kgdGhhbyB0w6FjIMSRxrDhu6NjIHTEg25nL2dp4bqjbSBt4buZdCBwaOG6p24gdOG7rSBi4bqldCBrw6wgKHggPSB4IC0gMSBob+G6t2MgeCA9IHggKyAxKSAKLy8gICBUw61uaCBz4buRIHRoYW8gdMOhYyDDrXQgbmjhuqV0IMSR4buDIHThuqV0IGPhuqMgbiBwaOG6p24gdOG7rSBi4bqxbmcgbmhhdT8KLy8gLSBIYXkgbsOzaSBjw6FjaCBraMOhYywgY+G6p24gdMOsbSB4IMSR4buDIGPhu7FjIHRp4buDdSBob8OhIHThu5VuZyB8YShpKSAtIHh8Ci8vID0+IMSQw6FwIMOhbjogeCBsw6AgdHJ1bmcgduG7iyAobWVkaWFuKSBj4bunYSBhIAoKLy8gLSDDgXAgZOG7pW5nIHbDoG8gYsOgaSBuw6B5LCBuaGnhu4dtIHbhu6UgY+G7p2EgdGEgbMOgIHbhu5tpIG3hu5dpIMSRb+G6oW4gayBwaOG6p24gdOG7rSwgY+G6p24gdMOsbSDEkcaw4bujYyBwaOG6p24gdOG7rSB0cnVuZyB24buLIChtZWRpYW4pLAovLyAgIHThu5VuZyB2w6Agc+G7kSBsxrDhu6NuZyBwaOG6p24gdOG7rSA8PSBtZWQsIHThu5VuZyB2w6Agc+G7kSBsxrDhu6NuZyBwaOG6p24gdOG7rSA+IG1lZAovLyAtIOG7niDEkcOieSBjw7Mgbmhp4buBdSBjw6FjaCB44butIGzDrSBvZmZsaW5lIChGZW53aWNrIFRyZWUsLi4uKSwgbmjGsG5nIGPDsyBjw6FjaCBsw6BtIG9ubGluZSBraW5oIMSRaeG7g246Ci8vIC0gxJDhu4Mgw70gcuG6sW5nIG1lZGlhbiBjaMOtbmggbMOgIHBo4bqnbiB04butIG7hurFtIOG7nyBjaMOtbmggZ2nhu69hIG3huqNuZyBzYXUga2hpIHNvcnQgbsOqbiDhu58gxJHDonkgdGEgY8OzIHRo4buDIGR1eSB0csOsIDIgbXVsdGlzZXQgbG8sIGhpIAovLyAtIG11bHRpc2V0IGxvIHPhur0gbMOgIHThuq1wIGPDoWMgcGjhuqduIHThu60gbuG6sW0g4bufIG7hu61hIHRyw6FpICg8PSBtZWQpLCBjw7luZyB24bubaSBzdW1fbG8gxJHhu4MgbMawdSB04buVbmcKLy8gICBtdWx0aXNldCBoaSBz4bq9IGzDoCB04bqtcCBjw6FjIHBo4bqnbiB04butIG7hurFtIOG7nyBu4butYSBwaOG6o2kgKD4gbWVkKSwgY8O5bmcgduG7m2kgc3VtX2hpIMSR4buDIGzGsHUgdOG7lW5nCi8vIC0gVGEgc+G6vSBsdcO0biBnaeG7ryBjaG8gMiBtdWx0aXNldCBsbywgaGkgxJHGsOG7o2MgY8OibiBi4bqxbmc6Ci8vICAgbG8uc2l6ZSgpID49IGhpLnNpemUoKSB2w6AgfGxvLnNpemUoKSAtIGhpLnNpemUoKXwgPD0gMQovLyAgIFN1eSByYSBoaS5zaXplKCkgPD0gbG8uc2l6ZSgpIDw9IGhpLnNpemUoKSArIDEKLy8gLSBLaGkgxJHDsywgcGjhuqduIHThu60gdHJ1bmcgduG7iyBjaMOtbmggbMOgICpsby5yYmVnaW4oKSAKLy8gLSBN4buXaSBraGkgdGjDqm0sIHhvw6EgcGjhuqduIHThu60gdGjDrCB0YSBz4bq9IGfhu41pIGjDoG0gcmViYWxhbmNlKCkgxJHhu4MgdMOhaSBjw6JuIGLhurFuZyB0aGVvIMSRaeG7gXUga2nhu4duIHRyw6puCgpjb25zdCBpbnQgTiA9IDJlNSArIDU7IAoKaW50IG4sIGs7ICAKaW50IGFbTl07IAoKbXVsdGlzZXQ8aW50PiBsbywgaGk7ICAKbGwgc3VtX2xvID0gMCwgc3VtX2hpID0gMDsgIAoKdm9pZCByZWJhbGFuY2UoKSB7Cgl3aGlsZSAobG8uc2l6ZSgpIDwgaGkuc2l6ZSgpKSB7CgkJaW50IHggPSAqaGkuYmVnaW4oKTsgaGkuZXJhc2UoaGkuZmluZCh4KSk7IAoJCXN1bV9oaSAtPSB4OyAgCgkJbG8uaW5zZXJ0KHgpOyAKCQlzdW1fbG8gKz0geDsKCX0KCXdoaWxlIChsby5zaXplKCkgPiBoaS5zaXplKCkgKyAxKSB7CgkJaW50IHggPSAqcHJldihsby5lbmQoKSk7IGxvLmVyYXNlKGxvLmZpbmQoeCkpOyAgCgkJc3VtX2xvIC09IHg7ICAKCQloaS5pbnNlcnQoeCk7IAoJCXN1bV9oaSArPSB4OyAKCX0KfQoKdm9pZCBhZGQoaW50IHgpIHsKCWlmIChsby5lbXB0eSgpIHx8IHggPD0gKmxvLnJiZWdpbigpKSB7CgkJbG8uaW5zZXJ0KHgpOyAKCQlzdW1fbG8gKz0geDsgCgl9CgllbHNlIHsKCQloaS5pbnNlcnQoeCk7IAoJCXN1bV9oaSArPSB4OyAKCX0KCXJlYmFsYW5jZSgpOyAKfQoKdm9pZCByZW1vdmUoaW50IHgpIHsKCWlmIChsby5maW5kKHgpICE9IGxvLmVuZCgpKSB7CgkJbG8uZXJhc2UobG8uZmluZCh4KSk7ICAKCQlzdW1fbG8gLT0geDsgIAoJfQoJZWxzZSB7CgkJaGkuZXJhc2UoaGkuZmluZCh4KSk7IAoJCXN1bV9oaSAtPSB4OyAKCX0KCXJlYmFsYW5jZSgpOyAgCn0KCmxsIGdldENvc3QoKSB7CglsbCBtZWQgPSAqbG8ucmJlZ2luKCk7ICAgCglsbCBjb3N0ID0gKG1lZCAqIChsbClsby5zaXplKCkgLSBzdW1fbG8pICsgKHN1bV9oaSAtIG1lZCAqIChsbCloaS5zaXplKCkpOyAKCXJldHVybiBjb3N0OyAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG4gPj4gazsgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNpbiA+PiBhW2ldOyAKCglmb3IgKGludCBpID0gMTsgaSA8PSBrOyBpKyspIGFkZChhW2ldKTsgIAoJY291dCA8PCBnZXRDb3N0KCkgPDwgJyAnOyAKCglmb3IgKGludCBpID0gayArIDE7IGkgPD0gbjsgaSsrKSB7CgkJYWRkKGFbaV0pOyAgCgkJcmVtb3ZlKGFbaSAtIGtdKTsgIAoJCWNvdXQgPDwgZ2V0Q29zdCgpIDw8ICcgJzsgCgl9Cn0KCQo=