Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int const N = 222222;
- int const B = 678;
- int const C = N / B;
- vector<int> blocks[C];
- int a[N];
- void recalc() {
- int cn = 0;
- for (int i = 0; !blocks[i].empty(); i++) {
- for (int j : blocks[i])
- a[cn++] = j;
- blocks[i].clear();
- }
- for (int i = 0, cur = 0; cur < cn; i++) {
- while (cur < cn && (int) blocks[i].size() < B) {
- blocks[i].push_back(a[cur++]);
- }
- }
- }
- int main() {
- freopen("river.in", "r", stdin);
- freopen("river.out", "w", stdout);
- int n, noneed;
- scanf("%d%d", &n, &noneed);
- long long ans = 0;
- for (int i = 0; i < n; i++) {
- int x;
- scanf("%d", &x);
- ans += (long long) x * x;
- blocks[0].push_back(x);
- }
- recalc();
- int q;
- scanf("%d", &q);
- printf("%I64d\n", ans);
- for (int cq = 0; cq < q; cq++) {
- int type, id;
- scanf("%d%d", &type, &id);
- --id;
- if (type == 1) {
- int b = 0;
- int w = id;
- while ((int) blocks[b].size() <= w) {
- w -= blocks[b].size();
- b++;
- }
- int size = blocks[b][w];
- ans -= (long long) size * size;
- blocks[b].erase(blocks[b].begin() + w);
- int nb = b;
- int nw = w;
- while (nb + 1 < C && nw == (int) blocks[nb].size()) {
- nw = 0;
- nb++;
- }
- int pb = b;
- int pw = w - 1;
- while (pb > 0 && pw < 0) {
- --pb;
- pw = (int) blocks[pb].size() - 1;
- }
- bool hasNext = nw < (int) blocks[nb].size();
- bool hasPrev = pw >= 0;
- if (hasNext) ans -= (long long) blocks[nb][nw] * blocks[nb][nw];
- if (hasPrev) ans -= (long long) blocks[pb][pw] * blocks[pb][pw];
- if (hasNext && hasPrev) {
- blocks[pb][pw] += size / 2;
- blocks[nb][nw] += (size + 1) / 2;
- } else if (hasNext)
- blocks[nb][nw] += size;
- else
- blocks[pb][pw] += size;
- if (hasNext) ans += (long long) blocks[nb][nw] * blocks[nb][nw];
- if (hasPrev) ans += (long long) blocks[pb][pw] * blocks[pb][pw];
- } else {
- int b = 0;
- int w = id;
- while ((int) blocks[b].size() <= w) {
- w -= blocks[b].size();
- b++;
- }
- int half = blocks[b][w] / 2;
- ans -= (long long) blocks[b][w] * blocks[b][w];
- blocks[b][w] -= half;
- ans += (long long) blocks[b][w] * blocks[b][w];
- blocks[b].insert(blocks[b].begin() + w, half);
- ans += (long long) blocks[b][w] * blocks[b][w];
- }
- if (cq % (15 * B) == 0) recalc();
- printf("%I64d\n", ans);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment