Submission #288240

#TimeUsernameProblemLanguageResultExecution timeMemory
288240BenmathXORanges (eJOI19_xoranges)C++14
100 / 100
998 ms10104 KiB
#include<bits/stdc++.h>
using namespace std;
int arr[200000];
int tree1[800000];
int tree2[800000];
int b[200000];
int c[200000];
void build1(int node,int start,int end){
 if(start==end){
        tree1[node]=b[start];
    }else{
        int mid=(start+end)/2;
        build1(2*node,start,mid);
        build1(2*node+1,mid+1,end);
        tree1[node]=tree1[2*node] ^ tree1[2*node+1];
    }

}
void build2(int node,int start,int end){
    if(start==end){
        tree2[node]=c[start];
    }else{
        int mid=(start+end)/2;
        build2(2*node,start,mid);
        build2(2*node+1,mid+1,end);
        tree2[node]=tree2[2*node] ^ tree2[2*node+1];
    }

}
void update1(int node,int start,int end,int index,int val){
    if(start==end){
        tree1[node]=val;
        b[index]=val;
    }else{
        int mid=(start+end)/2;
        if(start<=index and index<=mid){
            update1(2*node,start,mid,index,val);
        }else{
            update1(2*node+1,mid+1,end,index,val);
        }
        tree1[node]=tree1[2*node] ^ tree1[2*node+1];
    }
}
void update2(int node,int start,int end,int index,int val){
    if(start==end){
        tree2[node]=val;
        c[index]=val;
    }else{
        int mid=(start+end)/2;
        if(start<=index and index<=mid){
            update2(2*node,start,mid,index,val);
        }else{
            update2(2*node+1,mid+1,end,index,val);
        }
        tree2[node]=tree2[2*node] ^ tree2[2*node+1];
    }
}
int query1(int node,int start,int end,int l,int r){
    if(r<start or l>end){
        return 0;
    }
    if(l<=start and end<=r){
        return tree1[node];
    }
    int mid=(start+end)/2;
    int p1=query1(2*node,start,mid,l,r);
    int p2=query1(2*node+1,mid+1,end,l,r);
    return (p1 ^ p2);
}
int query2(int node,int start,int end,int l,int r){
    if(r<start or l>end){
        return 0;
    }
    if(l<=start and end<=r){
        return tree2[node];
    }
    int mid=(start+end)/2;
    int p1=query2(2*node,start,mid,l,r);
    int p2=query2(2*node+1,mid+1,end,l,r);
    return (p1 ^ p2);
}
int main(){
    int n,q;
    cin>>n>>q;

int x=0;
int y=0;
    for(int i=0;i<n;i++){
        cin>>arr[i];
        if(i%2==0){
           b[x]=arr[i];
           x++;
        }else{
            c[y]=arr[i];
            y++;
        }
        
    }
  
   build1(1,0,x-1);
   build2(1,0,y-1);
    for(int i=0;i<q;i++){
        int a,b1,c1;
        cin>>a>>b1>>c1;
        if(a==1){
            if((b1-1)%2==0){
                update1(1,0,x-1,(b1-1)/2,c1);
                arr[b1-1]=c1;
            }else{
                update2(1,0,y-1,(b1-2)/2,c1);
                arr[b1-1]=c1;
            }
        }else{
           
            if(c1==b1){
                cout<<arr[b1-1]<<endl;
            }else if(abs(c1-b1)%2==1){
                cout<<0<<endl;
            }else{
           
            if((b1-1)%2==0){
              
                  cout<<query1(1,0,x-1,(b1-1)/2,(c1-1)/2)<<endl;
            }else{
                cout<<query2(1,0,y-1,(b1-2)/2,(c1-2)/2)<<endl;
            }
       
              
            }
        }
    }
}
#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...