Submission #406234

#TimeUsernameProblemLanguageResultExecution timeMemory
406234Ronin13XORanges (eJOI19_xoranges)C++14
100 / 100
671 ms14152 KiB
#include<bits/stdc++.h>
#define ll long long
#define f first
#define s second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ull unsigned ll
#define pb push_back
#define epb emplace_back
#define INF 1e9+1;
using namespace std;

vector<int>to(800001);
vector<int>te(800001);
vector<int>a(400001);
void build(int v,int l,int r){
    if(l==r){
        if(l%2)
        to[v]=a[l],te[v]=0;
        else te[v]=a[l],to[v]=0;
    }
    else{
        int m=(l+r)/2;
        build(2*v,l,m);
        build(2*v+1,m+1,r);
        te[v]=te[2*v]^te[2*v+1];
        to[v]=to[2*v]^to[2*v+1];
    }
}

void update(int v,int l,int r,int nw,int pos){
    if(l==r){
        if(l%2==0)te[v]=nw;
        else to[v]=nw;
        return;
    }

    int m=(l+r)/2;
    if(m>=pos)update(2*v,l,m,nw,pos);
    else update(2*v+1,m+1,r,nw,pos);
    te[v]=te[2*v]^te[2*v+1];
    to[v]=to[2*v]^to[2*v+1];
}

int getodd(int v,int l,int r,int tl,int tr){
    if(l==tl&&r==tr){
        return to[v];
    }
    int tm=(tl+tr)/2;
    if(r<=tm)return getodd(2*v,l,r,tl,tm);
    if(l>tm)return getodd(2*v+1,l,r,tm+1,tr);
    return getodd(2*v,l,tm,tl,tm)^getodd(2*v+1,tm+1,r,tm+1,tr);
}

int geteven(int v,int l,int r,int tl,int tr){
      if(l==tl&&r==tr){
        return te[v];
    }
    int tm=(tl+tr)/2;
    if(r<=tm)return geteven(2*v,l,r,tl,tm);
    if(l>tm)return geteven(2*v+1,l,r,tm+1,tr);
    return geteven(2*v,l,tm,tl,tm)^geteven(2*v+1,tm+1,r,tm+1,tr);
}

void solve(){
    int n,q;cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(q--){
        int ind;cin>>ind;
        switch(ind){
        case 1:
            int pos,nw;cin>>pos>>nw;
            update(1,1,n,nw,pos);
            break;
        case 2:int l,r;cin>>l>>r;
            if((r-l)&1)cout<<0<<"\n";
            else {
                if(l%2)cout<<getodd(1,l,r,1,n)<<"\n";
                else cout<<geteven(1,l,r,1,n)<<"\n";

                }
        }
    }
}

int main(){
    int t;t=1;
    while(t--){
        solve();
    }
}
#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...