Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int maxN = 1.1e9;
- struct Node {
- int L, R, val, sz;
- Node() {
- L = R = val = sz = 0;
- }
- };
- #define fi first
- #define se second
- ll sqr(ll x) {
- return x * x;
- }
- struct SegTree {
- vector<Node> T;
- ll ans;
- ll sz;
- SegTree() {
- ans = 0;
- sz = 0;
- T.push_back(Node());
- T.push_back(Node());
- }
- void push(int v) {
- if(T[v].L == 0) {
- T[v].L = T.size();
- T.push_back(Node());
- }
- if(T[v].R == 0) {
- T[v].R = T.size();
- T.push_back(Node());
- }
- }
- void norm(int v) {
- if (v) {
- T[v].sz = T[T[v].L].sz + T[T[v].R].sz;
- }
- }
- void upd(int v, int tl, int tr, int i, int val) {
- if (tr - tl == 1) {
- ans -= sqr(T[v].val);
- sz -= T[v].sz;
- T[v].val = val;
- T[v].sz = (bool)val;
- ans += sqr(T[v].val);
- sz += T[v].sz;
- } else {
- int tm = (tl + tr) / 2;
- push(v);
- if(i < tm) {
- upd(T[v].L, tl, tm, i, val);
- } else {
- upd(T[v].R, tm, tr, i, val);
- }
- norm(v);
- }
- }
- pair<int,int> getKth(int v, int tl, int tr, int k) {
- if(tr - tl == 1) {
- return {v, tl};
- } else {
- int tm = tl + (tr - tl) / 2;
- push(v);
- pair<int, int> ans;
- if (T[T[v].L].sz >= k) {
- ans = getKth(T[v].L, tl, tm, k);
- } else {
- ans = getKth(T[v].R, tm, tr, k - T[T[v].L].sz);
- }
- norm(v);
- return ans;
- }
- }
- pair<int, int> getKth(int k) {
- return getKth(1, 1, maxN, k);
- }
- void upd(int i, int val) {
- upd(1, 1, maxN, i, val);
- }
- void merge(int a) {
- pair<int, int> v1 = getKth(a);
- pair<int, int> v2 = getKth(a + 1);
- int val2 = T[v1.fi].val + T[v2.fi].val;
- upd(v1.se, val2);
- upd(v2.se, 0);
- }
- void split(int a) {
- pair<int, int> v1 = getKth(a);
- int val = T[v1.fi].val;
- int v2 = v1.se + val / 2;
- upd(v1.se, val / 2);
- upd(v2, val - val / 2);
- }
- };
- int main() {
- #define task "river"
- freopen(task".in", "r", stdin);
- freopen(task".out", "w", stdout);
- int n, p;
- cin >> n >> p;
- int s = 1;
- SegTree T;
- while(n--) {
- int x;
- cin >> x;
- T.upd(s, x);
- s += x;
- }
- int q;
- cin >> q;
- cout << T.ans << endl;
- while(q--) {
- int t, a;
- cin >> t >> a;
- if(t == 1) {
- if (T.sz == a) {
- T.merge(a - 1);
- } else if(a == 1) {
- T.merge(1);
- } else {
- T.split(a);
- T.merge(a - 1);
- T.merge(a);
- }
- }
- if(t == 2) {
- T.split(a);
- }
- cout << T.ans << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement