Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 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 -> l -> value += p;
  34.         it -> r -> value += p;
  35.         upd_fun(it -> l);
  36.         upd_fun(it -> r);
  37.         if (it->l)  it->l-> p = p;
  38.         if (it->r)  it->r-> p = p;
  39.     }
  40.  
  41. }
  42. void merge(pitem & t, pitem l, pitem r){
  43.     push(l);
  44.     push(r);
  45.     if(!l || !r)
  46.         return void ( t = l ? l : r);
  47.     if(l -> prior > r -> prior){
  48.         merge(l -> r, l -> r, r), t = l;
  49.     }
  50.     else{
  51.         merge(r -> l, l, r -> l), t = r;
  52.     }
  53.     upd_cnt(t);
  54.     upd_fun(t);
  55. }
  56. void split(pitem t, pitem &l, pitem &r, int key, int add = 0){
  57.     if(!t)
  58.         return void(l = r = 0);
  59. //  push(t);
  60.     int cur_key = add + cnt(t -> l);
  61.     if(key <= cur_key)
  62.         split(t -> l, l, t -> l, key, add), r = t;
  63.     else
  64.         split(t -> r, t-> r, r, key, add + 1 + cnt(t -> l)), l = t;
  65.     upd_cnt(t);
  66.     upd_fun(t);
  67. }
  68. pitem new_pitem(int val){
  69.     pitem t = new item;
  70.     t -> value = val;
  71.     t -> fun = val;
  72.     t -> l = 0;
  73.     t -> r = 0;
  74.     t -> prior = rand();
  75.     t -> cnt = 1;
  76.     t -> p = 0;
  77.     return t;
  78. }
  79. void output (pitem t) {
  80.     if (!t)  return;
  81.     output (t->l);
  82.     printf ("%d ", t->value);
  83.     output (t->r);
  84. }
  85. int otr_fun(pitem t, int a, int b){
  86.     pitem t1, t2;
  87.     split(t, t, t1, a);
  88.     split(t1, t1, t2, b - a + 1);
  89.     int ans = t1 -> fun;
  90.     merge(tree, tree, t1);
  91.     merge(tree, tree, t2);
  92.     return ans;
  93. }
  94. void add(pitem &t, int x, int pos){
  95.     pitem t1, ad;
  96.     split(t, t, t1, pos);
  97.     ad = new_pitem(x);
  98.     merge(t, t, ad);
  99.     merge(t, t, t1);
  100. }
  101. void del(pitem &t, int pos){
  102.     pitem t1, del;
  103.     split(t, t, del, pos);
  104.     split(del, del, t1, 1);
  105.     merge(t, t, t1);
  106.     output(t);
  107. }
  108. void upd(pitem &t, int pos, int x){
  109.     pitem t1, nw;
  110.     split(t, t, nw, pos);
  111.     split(nw, nw, t1, 1);
  112.     nw -> value = x;
  113.     upd_fun(nw);
  114.     merge(t, t, nw);
  115.     merge(t, t, t1);
  116. }
  117. void otr_upd(pitem &t, int a, int b, int x){
  118.     pitem t1, t2;
  119.     split(t, t, t1, a);
  120.     split(t1, t1, t2, b - a + 1);
  121.     t1 -> p = x;
  122.     t1 -> value += x;
  123.     upd_fun(t1);
  124.     merge(t, t, t1);
  125.     merge(t, t, t2);
  126. }
  127. int main(){
  128.     freopen("in.txt", "r", stdin);
  129.     int n;
  130.     cin >> n;
  131.     for(int i = 0; i < n; i++){
  132.         int a;
  133.         cin >> a;
  134.         pitem t1 = new_pitem(a);
  135.         merge(tree, tree, t1);
  136.     //  output(tree);
  137.     //  cout << endl;
  138.     }
  139.     otr_upd(tree,1, 3, 55);
  140.     output(tree);
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement