169542025-05-18 14:04:23gfaragoXORangescpp17Wrong answer 38/100661ms9404 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 l, int r, int v){
    // cout << "build_odd " << l << " " << r << " " << v << "\n";
    if(r==l){
        binodd[v]=a[r*2];
        return binodd[v];
    }
    int tm=(r+l)/2;
    binodd[v]=build_odd(l, tm, v*2) ^ build_odd(tm+1, r, v*2+1);
    return binodd[v];
}

int query_odd(int l, int r, int ll, int rr, int v){
    // cout << "query_odd " << l << " " << r << " " << ll << " " << rr << " " << v << "\n";
    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){
    // cout << "update_odd " << i << " " << h << " " << l << " " << r << " " << v << "\n";
    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 l, int r, int v){
    // cout << "build_even " << l << " " << r << " " << v << "\n";
    if(r==l){
        bineven[v]=a[r*2+1];
        // cout << "build_even " << l << " " << r << " " << v << " -> " << bineven[v] << "\n";
        return bineven[v];
    }
    int tm=(r+l)/2;
    bineven[v]=build_even(l, tm, v*2) ^ build_even(tm+1, r, v*2+1);
    // cout << "build_even " << l << " " << r << " " << v << " -> " << bineven[v] << "\n";
    return bineven[v];
}

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

void update_even(int i, int h, int l, int r, int v){
    // cout << "update_even " << i << " " << h << " " << l << " " << r << " " << v << "\n";
    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(2*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);
    build_even(0, n/2, 1);
    // cout << "binodd:"; for (int i = 0; i < n*2; i++) cout << " " << binodd[i]; cout << "\n";
    // cout << "bineven:"; for (int i = 0; i < n*2; i++) cout << " " << bineven[i]; cout << "\n";
    while(q--){
        int x, y, z; cin>>x>>y>>z;
        if(x==1){
            if(y%2==1){
                // cout << "\nupdate_odd\n";
                update_odd(y/2, z, 0, (n+1)/2, 1);
                // cout << "binodd:"; for (int i = 0; i < n*2; i++) cout << " " << binodd[i]; cout << "\n";
            }else{
                y--;
                // cout << "\nupdate_even\n";
                update_even(y/2, z, 0, n/2, 1);
                // cout << "bineven:"; for (int i = 0; i < n*2; i++) cout << " " << bineven[i]; cout << "\n";
            }
            a[y] = z;
        }else{
            if((z-y)%2==0 && z%2==1){
                // cout << "\nquery_odd\n";
                // cout << "binodd:"; for (int i = 0; i < n*2; i++) cout << " " << binodd[i]; cout << "\n";
                cout<<query_odd(0, (n+1)/2, y/2, z/2, 1)<<'\n';
            }else if((z-y)%2==0){
                y--;
                z--;
                // cout << "\nquery_even\n";
                // cout << "bineven:"; for (int i = 0; i < n*2; i++) cout << " " << bineven[i]; cout << "\n";
                cout<<query_even(0, n/2, y/2, z/2, 1)<<'\n';
            }else{
                cout<<0<<'\n';
            }
        }
    }
}
SubtaskSumTestVerdictTimeMemory
subtask10/12
1Wrong answer1ms316 KiB
2Wrong answer1ms316 KiB
3Wrong answer1ms316 KiB
4Accepted1ms512 KiB
5Accepted1ms316 KiB
subtask218/18
1Accepted2ms316 KiB
2Accepted2ms316 KiB
3Accepted2ms316 KiB
4Accepted2ms316 KiB
5Accepted2ms316 KiB
subtask30/25
1Wrong answer13ms564 KiB
2Wrong answer13ms564 KiB
3Wrong answer14ms568 KiB
4Wrong answer16ms608 KiB
subtask420/20
1Accepted646ms9264 KiB
2Accepted661ms9400 KiB
3Accepted660ms9268 KiB
4Accepted625ms9404 KiB
5Accepted582ms9400 KiB
subtask50/25
1Wrong answer507ms8756 KiB
2Wrong answer507ms8636 KiB
3Wrong answer514ms8756 KiB
4Wrong answer601ms9152 KiB
5Wrong answer575ms9332 KiB