Advertisement
Guest User

Segment Tree

a guest
Nov 27th, 2014
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. /*-----------------Segment Tree---------------------*/
  2. struct Segment_tree {
  3.     int n, sz;
  4.     ll t[maxn * 4], u[maxn * 4];
  5.     int right(int i) {
  6.         return (i << 1) + 1;
  7.     }
  8.     int left(int i) {
  9.         return (i << 1);
  10.     }
  11.     void recalc(int x) {
  12.         t[x] = t[left(x)] + t[right(x)];   
  13.     }
  14.     void udown(int x) {
  15.         t[x] += u[x];
  16.         if (x <= sz) {
  17.             u[left(x)] += u[x];
  18.             u[right(x)] += u[x];
  19.         }  
  20.         u[x] = 0;
  21.     }
  22.     void init(int _n) {
  23.         n = _n;
  24.         for(sz = 1; sz < n; sz <<= 1);
  25.         --sz;                            
  26.     }                                            
  27.     void upd(int ql, int qr, int delta, int x = 1, int tl = 1, int tr = -1) {
  28.         if (tr == -1) tr = sz + 2;
  29.         udown(x);                        
  30.         if (tl >= qr || tr <= ql) return;
  31.         if (ql <= tl && tr <= qr) {
  32.             u[x] += delta;
  33.             udown(x);                                              
  34.             return;            
  35.         }                      
  36.         int mid = (tl + tr) / 2;
  37.         upd(ql, qr, delta, left(x), tl, mid);
  38.         upd(ql, qr, delta, right(x), mid, tr);
  39.         recalc(x);
  40.     }                      
  41.     ll get(int ql, int qr, int x = 1, int tl = 1, int tr = -1) {  
  42.         if (tr == -1) tr = sz + 2;
  43.         udown(x);
  44.         if (tl >= qr || tr <= ql) return 0;
  45.         if (ql <= tl && tr <= qr)
  46.             return t[x];                  
  47.         int mid = (tl + tr) / 2;
  48.         ll ans = 0;
  49.         ans += get(ql, qr, left(x), tl, mid);
  50.         ans += get(ql, qr, right(x), mid, tr);
  51.         return ans;
  52.     }
  53. } jinv_tree, minv_tree;
  54.  
  55. /*------End of Segment Tree----------*/
  56.  
  57. /*------Intersection Tree------------*/
  58.  
  59. struct Intersection_tree {
  60.     int n, sz;
  61.     node t[maxn * 4];
  62.     int right(int i) {
  63.         return (i << 1) + 1;
  64.     }
  65.     int left(int i) {
  66.         return (i << 1);
  67.     }
  68.     void recalc(int x) {                
  69.         t[x].sum_b = t[left(x)].sum_b + t[right(x)].sum_b;
  70.         t[x].num_b = t[left(x)].num_b + t[right(x)].num_b; 
  71.         if (t[left(x)].r_b && t[right(x)].l_b) --t[x].num_b;
  72.         t[x].l_b = t[left(x)].l_b, t[x].r_b = t[right(x)].r_b;      
  73.     }                                    
  74.     void push(int x, int tl, int tr) {
  75.         if (!t[x].upd) return;                
  76.         if (t[x].new_c == 0) {        
  77.             t[x].sum_b = tr - tl;        
  78.             t[x].num_b = 1;
  79.             t[x].l_b = 1, t[x].r_b = 1;  
  80.         }                                                                              
  81.         else {
  82.             t[x].sum_b = t[x].num_b = 0;
  83.             t[x].l_b = 0, t[x].r_b = 0;  
  84.         }            
  85.         t[x].upd = 0;                
  86.         if (tl == tr - 1) return;                  
  87.         t[left(x)].upd = 1;
  88.         t[left(x)].new_c = t[x].new_c;
  89.         t[right(x)].upd = 1;
  90.         t[right(x)].new_c = t[x].new_c;
  91.     }
  92.     void init(int _n) {
  93.         n = _n;
  94.         for(sz = 1; sz < n; sz <<= 1);
  95.         --sz;        
  96.     }
  97.     void upd(int ql, int qr, char delta, int x = 1, int tl = 1, int tr = -1) {  
  98.         if (tr == -1)                                                        
  99.             tr = sz + 2;
  100.         push(x, tl, tr);                
  101.         if (tl >= qr || tr <= ql) return;                                      
  102.         if (ql <= tl && tr <= qr) {  
  103.             t[x].upd = 1;
  104.             t[x].new_c = (delta == 'W');
  105.             push(x, tl, tr);
  106.             return;
  107.         }                        
  108.         int mid = (tl + tr) / 2;
  109.         upd(ql, qr, delta, left(x), tl, mid);
  110.         upd(ql, qr, delta, right(x), mid, tr);      
  111.         recalc(x);
  112.     }
  113.     pair <int, int> get() {
  114.         return mp(t[1].num_b, t[1].sum_b);
  115.     }  
  116. } tree;
  117.  
  118. /*------End of Intersection Tree----------*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement