Advertisement
welleyth

E.

May 5th, 2023
699
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. //#define int long long
  6.  
  7. constexpr int N = (int)2e5 + 111;
  8. constexpr int md = (int)998244353;
  9.  
  10. int a[N];
  11.  
  12. struct ST{
  13.     int t[4*N][30];
  14.     int w[4*N][30];
  15.     ST(){
  16.         memset(t,0,sizeof t);
  17.         memset(w,0,sizeof w);
  18.     }
  19.     void push(int v){
  20.         for(int j = 0; j < 30; j++){
  21.             t[v<<1][j] += w[v][j];
  22.             t[v<<1|1][j] += w[v][j];
  23.             w[v<<1][j] += w[v][j];
  24.             w[v<<1|1][j] += w[v][j];
  25.             w[v][j] = 0;
  26.         }
  27.         return;
  28.     }
  29.     void upd(int v,int l,int r,int tl,int tr,int x){
  30.         if(l > r || tl > tr) return;
  31.         if(l == tl && r == tr){
  32.             int d = 1;
  33.             if(x < 0) x = -x, d = -1;
  34.             for(int j = 0; j < 30; j++){
  35.                 if((x >> j & 1) == 0){
  36.                     t[v][j] += d;
  37.                     w[v][j] += d;
  38.                 }
  39.             }
  40.             return;
  41.         }
  42.         push(v);
  43.         int m = (l+r)>>1;
  44.         upd(v<<1,l,m,tl,min(tr,m),x);
  45.         upd(v<<1|1,m+1,r,max(tl,m+1),tr,x);
  46.         for(int j = 0; j < 30; j++){
  47.             t[v][j] = min(t[v<<1][j],t[v<<1|1][j]);
  48.         }
  49.         return;
  50.     }
  51.     int get(int v,int l,int r,int tl,int tr){
  52.         if(l > r || tl > tr) return 0;
  53.         if(l == tl && r == tr) {
  54.             int ans = 0;
  55.             for(int j = 0; j < 30; j++){
  56.                 if(t[v][j] == 0)
  57.                     ans |= (1 << j);
  58.             }
  59. //            cout << "l,r: " << l << " " << r << ", ans: " << ans << "\n";
  60.             return ans;
  61.         }
  62.         push(v);
  63.         int m = (l+r)>>1;
  64.         return get(v<<1,l,m,tl,min(tr,m)) | get(v<<1|1,m+1,r,max(tl,m+1),tr);
  65.     }
  66. } ST;
  67.  
  68. void solve(){
  69.     int n,q;
  70.     cin >> n >> q;
  71.  
  72.     for(int i = 1; i <= n; i++) cin >> a[i];
  73.     for(int i = 1; i <= n; i++){
  74.         ST.upd(1,1,n,i,i,a[i]);
  75.     }
  76.  
  77.     int l[q+1],r[q+1],x[q+1];
  78.  
  79.     for(int i = 1; i <= q; i++){
  80.         int tp;
  81.         cin >> tp;
  82.         if(tp == 1){
  83.             cin >> l[i] >> r[i] >> x[i];
  84.             ST.upd(1,1,n,l[i],r[i],x[i]);
  85.         } else if(tp == 2){
  86.             int l,r;
  87.             cin >> l >> r;
  88.             int ans = ST.get(1,1,n,l,r);
  89.             cout << ans << "\n";
  90.         } else {
  91.             int id;
  92.             cin >> id;
  93.             ST.upd(1,1,n,l[id],r[id],-x[id]);
  94.         }
  95.     }
  96.  
  97.     return;
  98. }
  99.  
  100. signed main(){
  101.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  102. //  freopen("output.txt","w",stdout);
  103.     int tests = 1;
  104. //    cin >> tests;
  105.     for(int test = 1; test <= tests; test++){
  106.         solve();
  107.     }
  108.     return 0;
  109. }
  110. /**
  111. **/
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement