Submission #1305864

#TimeUsernameProblemLanguageResultExecution timeMemory
1305864NewtonabcXORanges (eJOI19_xoranges)C++20
100 / 100
361 ms5124 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MOD=1e9+7;
const int N=5e5+10;
const int M=1<<19;
int arr[N];
struct stree{
    int s[M],arr[N];
    void build(int l,int r,int idx){
        if(l==r) return void(s[idx]=arr[l]);
        int m=(l+r)/2;
        build(l,m,idx*2);
        build(m+1,r,idx*2+1);
        s[idx]=s[idx*2]^s[idx*2+1];
    }
    void update(int l,int r,int idx,int a,int b){
        if(a<l || a>r) return;
        if(l==r) return void(s[idx]=b);
        int m=(l+r)/2;
        update(l,m,idx*2,a,b);
        update(m+1,r,idx*2+1,a,b);
        s[idx]=s[idx*2]^s[idx*2+1];
    }
    int query(int l,int r,int idx,int a,int b){
        if(a>r || b<l) return 0;
        if(a<=l && b>=r) return s[idx];
        int m=(l+r)/2;
        return query(l,m,idx*2,a,b)^query(m+1,r,idx*2+1,a,b);
    }
}sa,sb;
int main(){
    int n,q;
    cin>>n >>q;
    for(int i=0;i<n;i++) cin>>arr[i];
    int na=(n+1)/2,nb=(n)/2;
    for(int i=0;i<n;i++){
        if(i%2==0) sa.arr[i/2]=arr[i];
        else sb.arr[i/2]=arr[i];
    }
    // cout<<na-1 <<" " <<nb-1 <<"\n";
    sa.build(0,na-1,1);
    sb.build(0,nb-1,1);
    // for(int i=0;i<na;i++) cout<<sa.query(0,na-1,1,i,i) <<" ";
    // cout<<"\n";
    // for(int i=0;i<nb;i++) cout<<sb.query(0,nb-1,1,i,i) <<" ";
    // cout<<"\n";
    while(q--){
        //cout<<"tmp" <<"\n";
        int t,a,b;
        cin>>t >>a >>b;
        if(t==1){
            a--;
            if(a%2==0) sa.update(0,na-1,1,a/2,b);
            else sb.update(0,nb-1,1,a/2,b);
        }
        else{
            if((b-a+1)%2==0){
                cout<<0 <<"\n";
                continue;
            }
            a--,b--;
            if(a%2==0) cout<<sa.query(0,na-1,1,a/2,b/2) <<"\n";
            else cout<<sb.query(0,nb-1,1,a/2,b/2) <<"\n";
        }
        // for(int i=0;i<na;i++) cout<<sa.query(0,na-1,1,i,i) <<" ";
        // cout<<"\n";
        // for(int i=0;i<nb;i++) cout<<sb.query(0,nb-1,1,i,i) <<" ";
        // cout<<"\n";
    }
}
#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...