Advertisement
zhukov000

River.1208

Dec 31st, 2019
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.69 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAX_CNT_NODES = 200001;
  6.  
  7. struct Node
  8. {
  9.   int value, cnt, y;
  10.   int left, right;
  11.  
  12.   Node(int val = 0): value(val), cnt(1), left(0), right(0), y(0) { }
  13.   void gen_y()
  14.   {
  15.     y = (rand() << 15) + rand();
  16.   }
  17. };
  18.  
  19. Node nodes[MAX_CNT_NODES + 1];
  20. vector<bool> used(MAX_CNT_NODES + 1, false);
  21. queue<int> free_nodes;
  22.  
  23. void init_free_nodes_queue()
  24. {
  25.   for(int i=1; i<=MAX_CNT_NODES; ++i)
  26.     free_nodes.push(i);
  27. }
  28.  
  29. int alloc_node()
  30. {
  31.   if (!free_nodes.size())
  32.     return 0;
  33.   int i = free_nodes.front();
  34.   free_nodes.pop();
  35.   return i;
  36. }
  37.  
  38. void free_node(int i)
  39. {
  40.   used[i] = false;
  41.   free_nodes.push(i);
  42.   if (nodes[i].left) free_node(nodes[i].left);
  43.   if (nodes[i].right) free_node(nodes[i].right);
  44. }
  45.  
  46. struct Cartesian
  47. {
  48.     int root;
  49.  
  50.     Cartesian(): root(0) { srand(time(0)); }
  51.  
  52.     int get_cnt(const int & node)
  53.     {
  54.       if ( !node ) return 0;
  55.       return nodes[node].cnt;
  56.     }
  57.  
  58.     void update_cnt(const int &node)
  59.     {
  60.       if (!node) return;
  61.       int left_cnt = get_cnt(nodes[node].left);
  62.       int right_cnt = get_cnt(nodes[node].right);
  63.       nodes[node].cnt = left_cnt + right_cnt + 1;
  64.     }
  65.  
  66.     int get_node(const int & node, int i)
  67.     {
  68.       if (!node) return node;
  69.       int left_k = get_cnt(nodes[node].left);
  70.       if (i == left_k) return node;
  71.       if (i < left_k)
  72.         return get_node(nodes[node].left, i);
  73.       else
  74.         return get_node(nodes[node].right, i - left_k - 1);
  75.     }
  76.  
  77.     Node & operator[](int i)
  78.     {
  79.       if (i >= 0)
  80.         return nodes[get_node(root, i)];
  81.       return nodes[0];
  82.     }
  83.  
  84.     // [1 .. k] [k+1 ... n]
  85.     pair<int, int> split(const int & node, int k)
  86.     {
  87.       if (!node) return {0, 0};
  88.       int left_k = get_cnt(nodes[node].left);
  89.       if (k <= left_k )
  90.       {
  91.         auto res = split(nodes[node].left, k);
  92.         nodes[node].left = res.second;
  93.         update_cnt(node);
  94.         return {res.first, node};
  95.       }
  96.       else
  97.       {
  98.         auto res = split(nodes[node].right, k - 1 - left_k);
  99.         nodes[node].right = res.first;
  100.         update_cnt(node);
  101.         return {node, res.second};
  102.       }
  103.     }
  104.  
  105.     int merge(const int & node1, const int & node2)
  106.     {
  107.       if ( !node1 ) return node2;
  108.       if ( !node2 ) return node1;
  109.       if ( nodes[node1].y <= nodes[node2].y )
  110.       {
  111.         nodes[node1].right = merge(nodes[node1].right, node2);
  112.         update_cnt(node1);
  113.         return node1;
  114.       }
  115.       else
  116.       {
  117.         nodes[node2].left = merge(node1, nodes[node2].left);
  118.         update_cnt(node2);
  119.         return node2;
  120.       }
  121.     }
  122.  
  123.     // after k
  124.     int insert(const int & val, const int & k, bool & error)
  125.     {
  126.       error = false;
  127.       if (k > get_cnt(root) + 1) return root;
  128.       auto res = split(root, k);
  129.       int nnode = alloc_node();
  130.       if (!nnode)
  131.       {
  132.         error = true;
  133.         return root;
  134.       }
  135.       nodes[nnode].gen_y();
  136.       nodes[nnode].value = val;
  137.       nodes[nnode].cnt = 1;
  138.       root = merge(merge(res.first, nnode), res.second);
  139.       return root;
  140.     }
  141.  
  142.     int erase(const int & k)
  143.     {
  144.       if (k > get_cnt(root)) return root;
  145.       auto res1 = split(root, k);
  146.       auto res2 = split(res1.first, k-1);
  147.       // non-resursion delete
  148.       nodes[res2.second].value = nodes[res2.second].left = nodes[res2.second].right = 0;
  149.       free_node(res2.second);
  150.       root = merge(res2.first, res1.second);
  151.       return root;
  152.     }
  153.  
  154.     inline int size() { return get_cnt(root); }
  155.  
  156.     void print()
  157.     {
  158.       for(int i=0; i<size(); ++i)
  159.       {
  160.         cout << nodes[get_node(root, i)].value << " ";
  161.       }
  162.       cout << endl;
  163.     }
  164. };
  165.  
  166. void solve_cartesian()
  167. {
  168.   init_free_nodes_queue();
  169.   Cartesian manufactures;
  170.   int n;
  171.   cin >> n;
  172.   unsigned long long sum2 = 0;
  173.   for(int i=0; i<n; ++i)
  174.   {
  175.     bool insert_error = false;
  176.     int len;
  177.     cin >> len;
  178.     sum2 += len * len;
  179.     manufactures.insert( len, i + 1, insert_error );
  180.     assert(!insert_error);
  181.   }
  182.   cout << sum2 << '\n';
  183.   int k;
  184.   cin >> k;
  185.   for(int event = 0; event < k; ++event)
  186.   {
  187.     int e, v;
  188.     cin >> e >> v;
  189.  
  190.     if (e == 1)
  191.     { // erase
  192.       Node & deleted = manufactures[v-1];
  193.       int value = deleted.value;
  194.       sum2 -= 1LL * value * value;
  195.       Node & prev = manufactures[v-2];
  196.       Node & next = manufactures[v];
  197.  
  198.       if (v > 1 && v < manufactures.size())
  199.       {
  200.         sum2 -= 1LL * next.value * next.value + 1LL * prev.value * prev.value;
  201.         prev.value += value / 2;
  202.         next.value += value / 2 + value % 2;
  203.         sum2 += 1LL * next.value * next.value + 1LL * prev.value * prev.value;
  204.       }
  205.       else if  (v > 1)
  206.       {
  207.         sum2 -= 1LL * prev.value * prev.value;
  208.         prev.value += value;
  209.         sum2 += 1LL * prev.value * prev.value;
  210.       }
  211.       else
  212.       {
  213.         sum2 -= 1LL * next.value * next.value;
  214.         next.value += value;
  215.         sum2 += 1LL * next.value * next.value;
  216.       }
  217.  
  218.       manufactures.erase(v);
  219.     }
  220.     else
  221.     { //
  222.       Node & updated = manufactures[v-1];
  223.       int value = updated.value;
  224.       sum2 -= 1LL * value * value;
  225.       int nvalue = value / 2 + value % 2;
  226.       bool insert_error = false;
  227.       manufactures.insert(nvalue, v, insert_error);
  228.       value = updated.value = value / 2;
  229.       sum2 += (1LL * value * value + 1LL * nvalue * nvalue);
  230.       assert(!insert_error);
  231.     }
  232.     cout << sum2 <<  '\n';
  233.     // manufactures.print();
  234.   }
  235. }
  236.  
  237. int main()
  238. {
  239.   ios_base::sync_with_stdio(0);
  240.   cin.tie(0);
  241.   cout.tie(0);
  242.   srand(time(0));
  243.   // freopen("INPUT.TXT", "r", stdin);
  244.   // freopen("OUTPUT.TXT", "w", stdout);
  245.   solve_cartesian();
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement