169562025-05-18 14:32:10tomi7XORangescpp17Elfogadva 100/100657ms15668 KiB
// Source: https://usaco.guide/general/io

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

#define int long long

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>=l && i<=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;
    }
}


signed 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);
                a[y-1]=z;
            }else{
                y--;
                update_even(y/2, z, 0, n/2-1, 1);
                a[y]=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';
            }
        }
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask112/12
1Elfogadva1ms316 KiB
2Elfogadva1ms316 KiB
3Elfogadva1ms316 KiB
4Elfogadva1ms316 KiB
5Elfogadva1ms316 KiB
subtask218/18
1Elfogadva3ms316 KiB
2Elfogadva2ms316 KiB
3Elfogadva2ms504 KiB
4Elfogadva3ms316 KiB
5Elfogadva2ms316 KiB
subtask325/25
1Elfogadva13ms564 KiB
2Elfogadva13ms564 KiB
3Elfogadva14ms796 KiB
4Elfogadva14ms792 KiB
subtask420/20
1Elfogadva643ms15540 KiB
2Elfogadva657ms15668 KiB
3Elfogadva657ms15668 KiB
4Elfogadva620ms15660 KiB
5Elfogadva573ms15668 KiB
subtask525/25
1Elfogadva507ms14900 KiB
2Elfogadva497ms14900 KiB
3Elfogadva501ms15028 KiB
4Elfogadva602ms15412 KiB
5Elfogadva565ms15412 KiB