Submission #775012

#TimeUsernameProblemLanguageResultExecution timeMemory
775012vjudge1XORanges (eJOI19_xoranges)C++17
100 / 100
129 ms16076 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mid (start+end)/2
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);
int dizi[200005],tese[800005],cise[800005],sum=0;

void build(int node,int start,int end){
    if(start==end){
        if(start%2==1)tese[node]=dizi[start];
        else cise[node]=dizi[start];
        return ;
    }
    build(node*2,start,mid),build(node*2+1,mid+1,end);
    tese[node]=tese[node*2]^tese[node*2+1];
    cise[node]=cise[node*2]^cise[node*2+1];
}

void querytek(int node,int start,int end,int l,int r){
    if(start>end || start>r || end<l)return;
    if(start>=l && end<=r){
        sum^=tese[node];
        return ;
    }
    querytek(node*2,start,mid,l,r),querytek(node*2+1,mid+1,end,l,r);
}

void querycift(int node,int start,int end,int l,int r){
    if(start>end || start>r || end<l)return;
    if(start>=l && end<=r){
        sum^=cise[node];
        return ;
    }
    querycift(node*2,start,mid,l,r),querycift(node*2+1,mid+1,end,l,r);
}

void updatetek(int node,int start,int end,int pos,int val){
    if(!(start<=pos && end>=pos))return ;
    if(start==end && start==pos){
        tese[node]=val;
        return ;
    }
    updatetek(node*2,start,mid,pos,val),updatetek(node*2+1,mid+1,end,pos,val);
    tese[node]=tese[node*2]^tese[node*2+1];
}


void updatecift(int node,int start,int end,int pos,int val){
    if(!(start<=pos && end>=pos))return ;
    if(start==end && start==pos){
        cise[node]=val;
        return ;
    }
    updatecift(node*2,start,mid,pos,val),updatecift(node*2+1,mid+1,end,pos,val);
    cise[node]=cise[node*2]^cise[node*2+1];
}

int32_t main(){
    faster
    int n,q;cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>dizi[i];
    build(1,1,n);
    while(q--){
        int t,l,r;cin>>t>>l>>r;
        if(t==1){
            if(l%2==1)updatetek(1,1,n,l,r);
            else updatecift(1,1,n,l,r);
        }
        else{
            sum=0;
            if(l%2==1 && r%2==1)querytek(1,1,n,l,r);
            else if(l%2==0 && r%2==0)querycift(1,1,n,l,r);
            cout<<sum<<'\n';
        }
    }
    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...