Submission #1021309

#TimeUsernameProblemLanguageResultExecution timeMemory
1021309marXORanges (eJOI19_xoranges)C++14
100 / 100
406 ms11376 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int seg1[600009];
int seg2[600009];
int v[600009];
 
void build(int id,int l,int r){
    if(l == r){
        if(l % 2 == 1){
            return;
        }
        seg1[id] = v[l];
        return;
    }
    int mid = (l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    seg1[id] = seg1[id*2]^seg1[id*2+1];
}
 
void update(int l,int r,int u,int v,int k){
    if(l == r && l == v){
        seg1[u] = k;
        return;
    }
    if(v < l || v > r)return;
    int mid = (l+r)/2;
    update(l,mid,u*2,v,k);
    update(mid+1,r,u*2+1,v,k);
    seg1[u] = seg1[u*2]^seg1[u*2+1];
}
 
int query(int id,int l,int r,int a,int b,int res){
    if(a <= l && b >= r){
        return seg1[id]^res;
    }
    if(l > b || r < a){
        return res;
    }
    int mid = (l+r)/2;
    res = query(id*2,l,mid,a,b,res);
    res = query(id*2+1,mid+1,r,a,b,res);
    return res;
}
 
void build2(int id,int l,int r){
    if(l == r){
        if(l % 2 == 0){
            return;
        }
        seg2[id] = v[l];
        return;
    }
    int mid = (l+r)/2;
    build2(id*2,l,mid);
    build2(id*2+1,mid+1,r);
    seg2[id] = seg2[id*2]^seg2[id*2+1];
}
 
void update2(int l,int r,int u,int v,int k){
    if(l == r && l == v){
        seg2[u] = k;
        return;
    }
    if(v < l || v > r)return;
    ll mid=(l+r)/2;
    update2(l,mid,u*2,v,k);
    update2(mid+1,r,u*2+1,v,k);
    seg2[u] = seg2[u*2]^seg2[u*2+1];
}
 
 
int query2(int id,int l,int r,int a,int b,int res){
    if(a <= l && b >= r){
        return seg2[id]^res;
    }
    if(l > b || r < a){
        return res;
    }
    ll mid = (l+r)/2;
    res = query2(id*2,l,mid,a,b,res);
    res = query2(id*2+1,mid+1,r,a,b,res);
    return res;
}
 
int main() {
    int n,q;
    cin >> n >> q;
    for(int i = 0;i < n;i++){
        cin >> v[i];
    }
    build(1,0,n-1);
    build2(1,0,n-1);
    while(q--){
        int x,l,r;
        cin >> x >> l >> r;
        if(x == 1){
            l--;
            if(l % 2 == 0){
                update(0,n-1,1,l,r);
            }else{
                update2(0,n-1,1,l,r);
            }
        }else{
            l--;
            r--;
            if((r-l)%2 == 1){
                cout<<0<<endl;
            }else{
                if(l%2 == 0){
                    cout<<query(1,0,n-1,l,r,0)<<endl;
                }else{
                    cout<<query2(1,0,n-1,l,r,0)<<endl;
                }
            }
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...