Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int logn = 30, maxn = 2e5+5;
- int a[maxn], q_l[maxn], q_r[maxn], q_x[maxn];
- struct segtree{
- int lb, rb;
- int d[logn] = {0}, mx[logn];
- segtree *l, *r;
- segtree(int _lb, int _rb){
- lb = _lb, rb = _rb;
- if(lb == rb){
- for(int i = 0; i < logn; i++)
- if(a[lb]&(1<<i))
- mx[i] = 1;
- }
- else{
- int t = (lb + rb) / 2;
- l = new segtree(lb, t);
- r = new segtree(t+1, rb);
- for(int i = 0; i < logn; i++)
- mx[i] = max(l->mx[i], r->mx[i]);
- }
- }
- void push(){
- if(lb != rb){
- for(int i = 0; i < logn; i++){
- l->d[i] += d[i];
- r->d[i] += d[i];
- l->mx[i] += d[i];
- r->mx[i] += d[i];
- d[i] = 0;
- }
- }
- }
- void add(int lq, int rq, int mask, int x){
- if(lb > rq || rb < lq) return;
- push();
- if(rb <= rq && lb >= lq){
- for(int i = 0; i < logn; i++)
- if((mask&(1<<i)) == 0)
- d[i] += x, mx[i] += x;
- }
- else{
- l->add(lq, rq, mask, x);
- r->add(lq, rq, mask, x);
- for(int i = 0; i < logn; i++)
- mx[i] = max(l->mx[i], r->mx[i]);
- }
- }
- int rmq(int lq, int rq){
- if(lb > rq || rb < lq) return 0;
- push();
- if(rb <= rq && lb >= lq){
- int mask = 0;
- for(int i = 0; i < logn; i++)
- if(mx[i] > 0)
- mask |= (1<<i);
- return mask;
- }
- else return l->rmq(lq, rq) | r->rmq(lq, rq);
- }
- };
- int main(){
- ios::sync_with_stdio(false);
- cin.tie(0);
- int n, m;
- cin >> n >> m;
- for(int i = 0; i < n; i++)
- cin >> a[i];
- segtree p(0, n-1);
- for(int i = 1; i <= m; i++){
- int t;
- cin >> t;
- if(t == 1){
- cin >> q_l[i] >> q_r[i] >> q_x[i];
- q_l[i]--, q_r[i]--;
- p.add(q_l[i], q_r[i], q_x[i], -1);
- }
- if(t == 2){
- int l, r;
- cin >> l >> r;
- l--, r--;
- cout << p.rmq(l, r) << "\n";
- }
- if(t == 3){
- int k;
- cin >> k;
- p.add(q_l[k], q_r[k], q_x[k], 1);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement