Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int const inf = 1e9;
  4. typedef struct item * pitem;
  5. struct item
  6. {
  7.     int prior, value, cnt, fun;
  8.     pitem l, r;
  9.     int p;
  10.     item(){}
  11. };
  12. pitem tree;
  13. int cnt (pitem it){
  14.     return it ? it -> cnt : 0;
  15. }
  16. void upd_cnt(pitem it){
  17.     if(it)
  18.         it -> cnt = cnt(it -> l) + cnt(it -> r) + 1;
  19. }
  20.  
  21. int fun(pitem it){
  22.     return it ? it -> fun : 0;
  23. }
  24. void upd_fun(pitem it){
  25.     if(it)
  26.     //  it -> fun = max(it -> value, max(fun(it -> r), fun(it -> l)));
  27.         it -> fun = fun(it -> l) + fun(it -> r) + it -> value;
  28. }
  29. void push(pitem it){
  30.     if(it && it -> p){
  31.         int p = it -> p;
  32.         it -> p = 0;
  33.         it -> value += p;
  34.     //  upd_fun(it);
  35.         if (it->l)  it->l-> p = p;
  36.         if (it->r)  it->r-> p = p;
  37.     }
  38.  
  39. }
  40. void merge(pitem & t, pitem l, pitem r){
  41.     push(l);
  42.     push(r);
  43.     if(!l || !r)
  44.         return void ( t = l ? l : r);
  45.     if(l -> prior > r -> prior){
  46.         merge(l -> r, l -> r, r), t = l;
  47.     }
  48.     else{
  49.         merge(r -> l, l, r -> l), t = r;
  50.     }
  51.     upd_cnt(t);
  52.     upd_fun(t);
  53. }
  54. void split(pitem t, pitem &l, pitem &r, int key, int add = 0){
  55.     if(!t)
  56.         return void(l = r = 0);
  57.     push(t);
  58.     int cur_key = add + cnt(t -> l);
  59.     if(key <= cur_key)
  60.         split(t -> l, l, t -> l, key, add), r = t;
  61.     else
  62.         split(t -> r, t-> r, r, key, add + 1 + cnt(t -> l)), l = t;
  63.     upd_cnt(t);
  64.     upd_fun(t);
  65. }
  66. pitem new_pitem(int val){
  67.     pitem t = new item;
  68.     t -> value = val;
  69.     t -> fun = val;
  70.     t -> l = 0;
  71.     t -> r = 0;
  72.     t -> prior = rand();
  73.     t -> cnt = 1;
  74.     t -> p = 0;
  75.     return t;
  76. }
  77. void output (pitem t) {
  78.     if (!t)  return;
  79.     push(t);
  80.     output (t->l);
  81.     printf ("%d ", t->value);
  82.     output (t->r);
  83. }
  84. int otr_fun(pitem t, int a, int b){
  85.     pitem t1, t2;
  86.     split(t, t, t1, a);
  87.     split(t1, t1, t2, b - a + 1);
  88.     int ans = t1 -> fun;
  89.     merge(tree, tree, t1);
  90.     merge(tree, tree, t2);
  91.     return ans;
  92. }
  93. void add(pitem &t, int x, int pos){
  94.     pitem t1, ad;
  95.     split(t, t, t1, pos);
  96.     ad = new_pitem(x);
  97.     merge(t, t, ad);
  98.     merge(t, t, t1);
  99. }
  100. void del(pitem &t, int pos){
  101.     pitem t1, del;
  102.     split(t, t, del, pos);
  103.     split(del, del, t1, 1);
  104.     merge(t, t, t1);
  105.     output(t);
  106. }
  107. void upd(pitem &t, int pos, int x){
  108.     pitem t1, nw;
  109.     split(t, t, nw, pos);
  110.     split(nw, nw, t1, 1);
  111.     nw -> value = x;
  112.     upd_fun(nw);
  113.     merge(t, t, nw);
  114.     merge(t, t, t1);
  115. }
  116. void otr_upd(pitem &t, int a, int b, int x){
  117.     pitem t1, t2;
  118.     split(t, t, t1, a);
  119.     split(t1, t1, t2, b - a + 1);
  120.     t1 -> p = x;
  121.     push(t1);
  122.     merge(t, t, t1);
  123.     merge(t, t, t2);
  124. }
  125. int main(){
  126.     freopen("in.txt", "r", stdin);
  127.     int n;
  128.     cin >> n;
  129.     for(int i = 0; i < n; i++){
  130.         int a;
  131.         cin >> a;
  132.         pitem t1 = new_pitem(a);
  133.         merge(tree, tree, t1);
  134.     //  output(tree);
  135.     //  cout << endl;
  136.     }
  137.     otr_upd(tree,1, 3, 55);
  138.     output(tree);
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement