Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int logn = 30, maxn = 2e5+5;
  5.  
  6. int a[maxn], q_l[maxn], q_r[maxn], q_x[maxn];
  7.  
  8. struct segtree{
  9.     int lb, rb;
  10.     int d[logn] = {0}, mx[logn];
  11.     segtree *l, *r;
  12.     segtree(int _lb, int _rb){
  13.         lb = _lb, rb = _rb;
  14.         if(lb == rb){
  15.             for(int i = 0; i < logn; i++)
  16.                 if(a[lb]&(1<<i))
  17.                     mx[i] = 1;
  18.         }
  19.         else{
  20.             int t = (lb + rb) / 2;
  21.             l = new segtree(lb, t);
  22.             r = new segtree(t+1, rb);
  23.             for(int i = 0; i < logn; i++)
  24.                 mx[i] = max(l->mx[i], r->mx[i]);
  25.         }
  26.     }
  27.     void push(){
  28.         if(lb != rb){
  29.             for(int i = 0; i < logn; i++){
  30.                 l->d[i] += d[i];
  31.                 r->d[i] += d[i];
  32.                 l->mx[i] += d[i];
  33.                 r->mx[i] += d[i];
  34.                 d[i] = 0;
  35.             }
  36.         }
  37.     }
  38.     void add(int lq, int rq, int mask, int x){
  39.         if(lb > rq || rb < lq) return;
  40.         push();
  41.         if(rb <= rq && lb >= lq){
  42.             for(int i = 0; i < logn; i++)
  43.                 if((mask&(1<<i)) == 0)
  44.                     d[i] += x, mx[i] += x;
  45.         }
  46.         else{
  47.             l->add(lq, rq, mask, x);
  48.             r->add(lq, rq, mask, x);
  49.             for(int i = 0; i < logn; i++)
  50.                 mx[i] = max(l->mx[i], r->mx[i]);
  51.         }
  52.     }
  53.     int rmq(int lq, int rq){
  54.         if(lb > rq || rb < lq) return 0;
  55.         push();
  56.         if(rb <= rq && lb >= lq){
  57.             int mask = 0;
  58.             for(int i = 0; i < logn; i++)
  59.                 if(mx[i] > 0)
  60.                     mask |= (1<<i);
  61.             return mask;
  62.         }
  63.         else return l->rmq(lq, rq) | r->rmq(lq, rq);
  64.     }
  65. };
  66.  
  67. int main(){
  68.     ios::sync_with_stdio(false);
  69.     cin.tie(0);
  70.  
  71.     int n, m;
  72.     cin >> n >> m;
  73.  
  74.     for(int i = 0; i < n; i++)
  75.         cin >> a[i];
  76.  
  77.     segtree p(0, n-1);
  78.  
  79.     for(int i = 1; i <= m; i++){
  80.         int t;
  81.         cin >> t;
  82.         if(t == 1){
  83.             cin >> q_l[i] >> q_r[i] >> q_x[i];
  84.             q_l[i]--, q_r[i]--;
  85.             p.add(q_l[i], q_r[i], q_x[i], -1);
  86.         }
  87.         if(t == 2){
  88.             int l, r;
  89.             cin >> l >> r;
  90.             l--, r--;
  91.             cout << p.rmq(l, r) << "\n";
  92.         }
  93.         if(t == 3){
  94.             int k;
  95.             cin >> k;
  96.             p.add(q_l[k], q_r[k], q_x[k], 1);
  97.         }
  98.     }
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement