Advertisement
Guest User

Untitled

a guest
Jan 25th, 2015
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5.  
  6. const int maxN = 1.1e9;
  7.  
  8. struct Node {
  9.     int L, R, val, sz;
  10.     Node() {
  11.         L = R = val = sz = 0;
  12.     }
  13. };
  14.  
  15. #define fi first
  16. #define se second
  17.  
  18. ll sqr(ll x) {
  19.     return x * x;
  20. }
  21.  
  22. struct SegTree {
  23.     vector<Node> T;
  24.     ll ans;
  25.     ll sz;
  26.     SegTree() {
  27.         ans = 0;
  28.         sz = 0;
  29.         T.push_back(Node());
  30.         T.push_back(Node());
  31.     }
  32.     void push(int v) {
  33.         if(T[v].L == 0) {
  34.             T[v].L = T.size();
  35.             T.push_back(Node());
  36.         }
  37.         if(T[v].R == 0) {
  38.             T[v].R = T.size();
  39.             T.push_back(Node());
  40.         }
  41.     }
  42.     void norm(int v) {
  43.         if (v) {
  44.             T[v].sz = T[T[v].L].sz + T[T[v].R].sz;
  45.         }
  46.     }
  47.     void upd(int v, int tl, int tr, int i, int val) {
  48.         if (tr - tl == 1) {
  49.             ans -= sqr(T[v].val);
  50.             sz -= T[v].sz;
  51.             T[v].val = val;
  52.             T[v].sz = (bool)val;
  53.             ans += sqr(T[v].val);
  54.             sz += T[v].sz;
  55.         } else {
  56.             int tm = (tl + tr) / 2;
  57.             push(v);
  58.             if(i < tm) {
  59.                 upd(T[v].L, tl, tm, i, val);
  60.             } else {
  61.                 upd(T[v].R, tm, tr, i, val);
  62.             }
  63.             norm(v);
  64.         }
  65.     }
  66.     pair<int,int> getKth(int v, int tl, int tr, int k) {
  67.         if(tr - tl == 1) {
  68.             return {v, tl};
  69.         } else {
  70.             int tm = tl + (tr - tl) / 2;
  71.             push(v);
  72.             pair<int, int> ans;
  73.             if (T[T[v].L].sz >= k) {
  74.                 ans = getKth(T[v].L, tl, tm, k);
  75.             } else {
  76.                 ans = getKth(T[v].R, tm, tr, k - T[T[v].L].sz);
  77.             }
  78.             norm(v);
  79.             return ans;
  80.         }
  81.     }
  82.     pair<int, int> getKth(int k) {
  83.         return getKth(1, 1, maxN, k);
  84.     }
  85.     void upd(int i, int val) {
  86.         upd(1, 1, maxN, i, val);
  87.     }
  88.     void merge(int a) {
  89.         pair<int, int> v1 = getKth(a);
  90.         pair<int, int> v2 = getKth(a + 1);
  91.         int val2 = T[v1.fi].val + T[v2.fi].val;
  92.         upd(v1.se, val2);
  93.         upd(v2.se, 0);
  94.     }
  95.     void split(int a) {
  96.         pair<int, int> v1 = getKth(a);
  97.         int val = T[v1.fi].val;
  98.         int v2 = v1.se + val / 2;
  99.         upd(v1.se, val / 2);
  100.         upd(v2, val - val / 2);
  101.     }
  102. };
  103.  
  104. int main() {
  105.     #define  task "river"
  106.     freopen(task".in", "r", stdin);
  107.     freopen(task".out", "w", stdout);
  108.     int n, p;
  109.     cin >> n >> p;
  110.     int s = 1;
  111.     SegTree T;
  112.     while(n--) {
  113.         int x;
  114.         cin >> x;
  115.         T.upd(s, x);
  116.         s += x;
  117.     }
  118.     int q;
  119.     cin >> q;
  120.     cout << T.ans << endl;
  121.     while(q--) {
  122.         int t, a;
  123.         cin >> t >> a;
  124.         if(t == 1) {
  125.             if (T.sz == a) {
  126.                 T.merge(a - 1);
  127.             } else if(a == 1) {
  128.                 T.merge(1);
  129.             } else {
  130.                 T.split(a);
  131.                 T.merge(a - 1);
  132.                 T.merge(a);
  133.             }
  134.         }
  135.         if(t == 2) {
  136.             T.split(a);
  137.         }
  138.         cout << T.ans << endl;
  139.     }
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement