#include #include using namespace std; typedef long long LL; const int N = 100010, V = 1000000010; const LL INF = 9e18; int n, k, a[N]; LL ans; struct Node { int l, r, cnt; LL sum; }; struct SegTree { int rt, idx; Node seg[N * 100]; void PushUp(int u) { seg[u].cnt = seg[seg[u].l].cnt + seg[seg[u].r].cnt; seg[u].sum = seg[seg[u].l].sum + seg[seg[u].r].sum; } void Add(int &u, int ul, int ur, int x, LL v) { if (u == 0) u = ++idx; if (ul == ur) { seg[u].cnt += v / abs(v); seg[u].sum += v; return; } int mid = ul + ur >> 1; if (x <= mid) Add(seg[u].l, ul, mid, x, v); else Add(seg[u].r, mid + 1, ur, x, v); PushUp(u); } Node Query(int u, int ul, int ur, int l, int r) { if (u == 0) return { 0, 0, 0, 0LL }; if (l <= ul && ur <= r) return seg[u]; Node ret = { 0, 0, 0, 0LL }; int mid = ul + ur >> 1; if (mid >= l) { Node v1 = Query(seg[u].l, ul, mid, l, r); ret.cnt += v1.cnt, ret.sum += v1.sum; } if (mid + 1 <= r) { Node v2 = Query(seg[u].r, mid + 1, ur, l, r); ret.cnt += v2.cnt, ret.sum += v2.sum; } return ret; } int Kth(int u, int ul, int ur, int kth) { if (ul == ur) return ul; int mid = ul + ur >> 1; if (seg[seg[u].l].cnt >= kth) { return Kth(seg[u].l, ul, mid, kth); } else { return Kth(seg[u].r, mid + 1, ur, kth - seg[seg[u].l].cnt); } } }; SegTree sgt; int main() { scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); ans = INF; for (int i = 1; i <= n; ++i) { if (i < k) sgt.Add(sgt.rt, 1, V, a[i], a[i]); else { sgt.Add(sgt.rt, 1, V, a[i], a[i]); if (i > k) sgt.Add(sgt.rt, 1, V, a[i - k], -a[i - k]); int median = sgt.Kth(sgt.rt, 1, V, (k + 1) / 2); Node r1 = sgt.Query(sgt.rt, 1, V, 1, median - 1); Node r2 = sgt.Query(sgt.rt, 1, V, 1, median); LL v = 1LL * r1.cnt * median - r1.sum + sgt.seg[sgt.rt].sum - r2.sum - 1LL * (k - r2.cnt) * median; ans = min(ans, v); } } printf("%lld\n", ans); return 0; }