169522025-05-18 13:45:44tomi7XORangescpp17Wrong answer 38/100660ms8628 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;

vector<int> binodd;
vector<int> bineven;
vector<int> a;

int build_odd(int r, int l, int v){
    if(r==l){
        binodd[v]=a[r*2];
        return binodd[v];
    }
    int tm=(r+l)/2;
    binodd[v]=build_odd(r, tm, v*2) ^ build_odd(tm+1, l, v*2+1);
    return binodd[v];
}

int query_odd(int l, int r, int ll, int rr, int v){
    if(r==rr && l==ll){
        return binodd[v];
    }
    if(l>rr || r<ll){
        return 0;
    }
    int tm=(r+l)/2;
    return query_odd(l, tm, ll, min(tm, rr), v*2) ^ query_odd(tm+1, r, max(tm+1, ll), rr, v*2+1);
}

void update_odd(int i, int h, int l, int r, int v){
    if(i/2>=l && i/2<=r){
        binodd[v]=binodd[v]^a[i*2];
        binodd[v]=binodd[v]^h;
        if(r==l){
            return;
        }
        int tm=(r+l)/2;
        update_odd(i, h, l, tm, v*2);
        update_odd(i, h, tm+1, r, v*2+1);
    }else{
        return;
    }
}


int build_even(int r, int l, int v){
    if(r==l){
        bineven[v]=a[r*2+1];
        return bineven[v];
    }
    int tm=(r+l)/2;
    bineven[v]=build_even(r, tm, v*2) ^ build_even(tm+1, l, v*2+1);
    return bineven[v];
}

int query_even(int l, int r, int ll, int rr, int v){
    if(r==rr && l==ll){
        return bineven[v];
    }
    if(l>rr || r<ll){
        return 0;
    }
    int tm=(r+l)/2;
    return query_even(l, tm, ll, min(tm, rr), v*2) ^ query_even(tm+1, r, max(tm+1, ll), rr, v*2+1);
}

void update_even(int i, int h, int l, int r, int v){
    if(i>=l && i<=r){
        bineven[v]=bineven[v]^a[i*2+1];
        bineven[v]=bineven[v]^h;
        if(r==l){
            return;
        }
        int tm=(r+l)/2;
        update_even(i, h, l, tm, v*2);
        update_even(i, h, tm+1, r, v*2+1);
    }else{
        return;
    }
}


int main() {
	int n, q;cin>>n>>q;
    a.assign(n, 0);
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    bineven.assign(n*4, 0);
    binodd.assign(n*4, 0);
    build_odd(0, (n+1)/2-1, 1);
    build_even(0, n/2-1, 1);
    while(q--){
        int x, y, z;cin>>x>>y>>z;
        if(x==1){
            if(y%2==1){
                update_odd(y/2, z, 0, (n+1)/2-1, 1);
            }else{
                y--;
                update_even(y/2, z, 0, n/2-1, 1);
            }
            a[y-1]=z;
        }else{
            if((z-y)%2==0 && z%2==1){
                cout<<query_odd(0, (n+1)/2-1, y/2, z/2, 1)<<'\n';
            }else if((z-y)%2==0){
                y--; z--;
                cout<<query_even(0, n/2-1, y/2, z/2, 1)<<'\n';
            }else{
                cout<<0<<'\n';
            }
        }
    }
}
SubtaskSumTestVerdictTimeMemory
subtask10/12
1Wrong answer1ms508 KiB
2Wrong answer1ms316 KiB
3Wrong answer1ms508 KiB
4Wrong answer1ms316 KiB
5Accepted1ms316 KiB
subtask218/18
1Accepted2ms316 KiB
2Accepted2ms316 KiB
3Accepted3ms508 KiB
4Accepted2ms316 KiB
5Accepted2ms316 KiB
subtask30/25
1Wrong answer13ms564 KiB
2Wrong answer13ms584 KiB
3Wrong answer14ms420 KiB
4Wrong answer14ms588 KiB
subtask420/20
1Accepted660ms8620 KiB
2Accepted643ms8628 KiB
3Accepted640ms8616 KiB
4Accepted646ms8520 KiB
5Accepted578ms8500 KiB
subtask50/25
1Wrong answer495ms7988 KiB
2Wrong answer507ms7988 KiB
3Wrong answer509ms7988 KiB
4Wrong answer602ms8372 KiB
5Wrong answer570ms8508 KiB