제출 #1345264

#제출 시각아이디문제언어결과실행 시간메모리
1345264vjudge1XORanges (eJOI19_xoranges)C++20
100 / 100
85 ms15628 KiB
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int int_fast64_t
#define ul uint_fast32_t
#define ll int_fast64_t
#define dll long double
#define ull uint_fast64_t
#define spektar this_thread::sleep_for(chrono::milliseconds(50))

int log2floor(ull n){ return 63-__builtin_clzll(n); }

const int MAX=2e5+5;
vector<int> seqtree(4*MAX);
vector<int> seqtree1(4*MAX);
//vector<int> lazy(4*MAX);

void build(int v,int l,int r,vector<int>& k){
    if(l==r){
        if(l%2){
            seqtree[v]=k[l-1];
            seqtree1[v]=0;
        }
        else{
            seqtree[v]=0;
            seqtree1[v]=k[l-1];
        }
    }
    else{
        int m=(l+r)/2;
        build(2*v,l,m,k);
        build(2*v+1,m+1,r,k);
        seqtree[v]=seqtree[2*v]^seqtree[2*v+1];
        seqtree1[v]=seqtree1[2*v]^seqtree1[2*v+1];
    }
}
/*
void push(int v,int l,int r){
    seqtree[v]+=lazy[v]*(r-l+1);
    if(l!=r){
        lazy[2*v]+=lazy[v];
        lazy[2*v+1]+=lazy[v];
    }
    lazy[v]=0;
}
*/
void upd(int v,int l,int r,vector<int>& k,int a){
    if(l==r){
        if(l%2){
            seqtree[v]=k[l-1];
            seqtree1[v]=0;
        }
        else{
            seqtree[v]=0;
            seqtree1[v]=k[l-1];
        }
    }
    else{
        int m=(l+r)/2;
        if(a<=m) upd(2*v,l,m,k,a);
        else upd(2*v+1,m+1,r,k,a);
        seqtree[v]=seqtree[2*v]^seqtree[2*v+1];
        seqtree1[v]=seqtree1[2*v]^seqtree1[2*v+1];
    }
}
/*
void upd(int v,int l,int r,vector<int>& k,int l1,int r1,int a){
    if(l>=l1 && r<=r1){
        lazy[v]+=a;
        push(v,l,r);
    }
    else{
        if(lazy[v]>0) push(v,l,r);
        int m=(l+r)/2;
        if(!(l>r1 || m<l1)) upd(2*v,l,m,k,l1,r1,a);
        if(!(m+1>r1 || r<l1)) upd(2*v+1,m+1,r,k,l1,r1,a);
        seqtree[v]=seqtree[2*v]+seqtree[2*v+1];
    }
}
*/
int ask(int v,int l,int r,int l1,int r1){
    //if(lazy[v]>0) push(v,l,r);
    if(r<l1 || l>r1) return 0;
    if(l1<=l && r<=r1){
        if(l1%2==1) return seqtree[v];
        else return seqtree1[v];
    }
    else{
        int m=(l+r)/2;
        return ask(2*v,l,m,l1,r1)^ask(2*v+1,m+1,r,l1,r1);
    }
}

void solve(){
    int n,m;
    cin >> n >> m;
    vector<int> k(n);
    for(auto& i:k) cin >> i;
    build(1,1,n,k);
    for(int i=0; i<m; i++){
        int a,b,c;
        cin >> a >> b >> c;
        if(a==1){
            k[b-1]=c;
            upd(1,1,n,k,b);
        }
        else{
            if((c-b)%2) cout << 0 << endl;
            else cout << ask(1,1,n,b,c) << endl;
        }
    }
}

signed main(){
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int t=1;
    //cin >> t;
    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...