Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include "bits/stdc++.h"
- using namespace std;
- #define all(a) a.begin(), a.end()
- const int mxn = 1e5 + 3;
- struct BIT {
- int tree[mxn] = {};
- void upd(int r, int x) {
- for (; r < mxn; r += r & -r) {
- tree[r] += x;
- }
- }
- int get(int r) {
- int res = 0;
- for (; r > 0; r -= r & -r) {
- res += tree[r];
- }
- return res;
- }
- int sum(int l, int r) {
- return get(r) - get(l - 1);
- }
- int kth(int k, int s) {
- swap(k, s);
- k += get(s - 1);
- s = 0;
- for (int i = 20; i >= 0; i--) {
- if (s + (1ll << i) < mxn && tree[s + (1ll << i)] < k) {
- s += (1ll << i);
- k -= tree[s];
- }
- }
- return s + 1;
- }
- };
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- int n, k; cin >> n >> k;
- vector<pair<int, int>> a(n);
- vector<int> next(n + 3), last(n + 3);
- BIT T;
- for (int i = 0; i < n; i++) {
- cin >> a[i].first;
- a[i].second = i + 1;
- T.upd(i + 1, 1);
- next[i + 1] = i + 2;
- last[i + 1] = i;
- }
- next[0] = 1;
- last[n + 1] = n;
- next[n + 1] = n + 2;
- last[n + 2] = n + 1;
- T.upd(n + 1, 1);
- T.upd(n + 2, 1);
- long long ans = 0;
- sort(all(a));
- for (int i = 0; i <= n - k; i++) {
- int sub_k = k;
- int cnt_bad = T.sum(1, a[i].second);
- int left_1 = 0, left_2 = 1, right_1 = a[i].second, right_2 = T.kth(a[i].second + 1, 1);
- if (cnt_bad <= sub_k) {
- sub_k -= cnt_bad;
- left_2 = T.kth(1, 1);
- if (sub_k) {
- right_1 = T.kth(a[i].second + 1, sub_k);
- right_2 = T.kth(right_1 + 1, 1);
- }
- }
- else {
- left_1 = T.kth(1, cnt_bad - sub_k);
- left_2 = T.kth(left_1 + 1, 1);
- }
- while (1) {
- long long segs = (long long)(left_2 - left_1) * (long long)(right_2 - right_1);
- ans += (segs * a[i].first);
- if (right_2 == n + 1) {
- break;
- }
- swap(right_1, right_2);
- right_2 = next[right_1];
- swap(left_1, left_2);
- if (left_1 == a[i].second) {
- break;
- }
- left_2 = next[left_1];
- }
- T.upd(a[i].second, -1);
- next[last[a[i].second]] = next[a[i].second];
- last[next[a[i].second]] = last[a[i].second];
- }
- cout << ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement