Submission #1363384

#TimeUsernameProblemLanguageResultExecution timeMemory
1363384lizi14XORanges (eJOI19_xoranges)C++20
100 / 100
251 ms11352 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define ss second
#define ina insert
#define pb push_back
const int N=2e5+5;
int seg_1[4*N];
int seg_2[4*N];
int bati;
void update_1(int idx,int l,int r, int i, int x){
    if(r-l==1){
        seg_1[idx]=x;
        return;
    }
    if((l+r)/2>i){
        update_1(idx*2,l,(l+r)/2,i,x);
    }
    else{
        update_1(idx*2+1,(l+r)/2,r,i,x);
    }
    seg_1[idx]=seg_1[idx*2]^seg_1[idx*2+1];
}
void update_2(int idx,int l,int r, int i, int x){
    if(r-l==1){
        seg_2[idx]=x;
        return;
    }
    if((l+r)/2>i){
        update_2(idx*2,l,(l+r)/2,i,x);
    }
    else{
        update_2(idx*2+1,(l+r)/2,r,i,x);
    }
    seg_2[idx]=seg_2[idx*2]^seg_2[idx*2+1];
}
int sum_1(int idx,int l,int r,int a,int b){
    if(a>=r || b<=l){
        //bati^=0;
        return 0;
    }
    if(l>=a && r<=b){
        //bati^=seg[idx];
        return seg_1[idx];
    }
    int s1=sum_1(idx*2,l,(l+r)/2,a,b);
    int s2=sum_1(idx*2+1,(l+r)/2,r,a,b);
    // bati^=s1;
    // bati^=s2;
    return s1^s2;
}
int sum_2(int idx,int l,int r,int a,int b){
    if(a>=r || b<=l){
        //bati^=0;
        return 0;
    }
    if(l>=a && r<=b){
        //bati^=seg[idx];
        return seg_2[idx];
    }
    int s1=sum_2(idx*2,l,(l+r)/2,a,b);
    int s2=sum_2(idx*2+1,(l+r)/2,r,a,b);
    // bati^=s1;
    // bati^=s2;
    return s1^s2;
}
signed main(){
    int n,t;
    cin>>n>>t;
    int x[n+1];
    for(int i=1; i<=n; i++){
        cin>>x[i];
        if(i%2==1)update_1(1,1,n+1,i,x[i]);
        else{
            update_2(1,1,n+1,i,x[i]);
        }
    }
    // int k=3^2;
    // cout<<k<<endl;
    //cout<<sum(1,1,n+1,1,n)<<endl;
    // cout<<bati<<endl;
    for(int q=0; q<t; q++){
        int a;
        cin>>a;
        if(a==1){
            int b,c;
            cin>>b>>c;
            if(b%2==1)update_1(1,1,n+1,b,c);
            else{
                update_2(1,1,n+1,b,c);
            }
        }
        else{
            int b,c;
            cin>>b>>c;
            if((c-b+1)%2==0){
                cout<<0<<endl;
                continue;
            }
            //bati=0;
            int ans=0;
            if(b%2==1)ans=sum_1(1,1,n+1,b,c+1);
            else ans=sum_2(1,1,n+1,b,c+1);
            cout<<ans<<endl;
        }
    }
}
/*
3 3
1 2 3
2 1 3
1 1 3
2 1 3

5 6
1 2 3 4 5
2 1 3
1 1 3
2 1 5
2 4 4
1 1 1
2 4 4
*/


#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...