Submission #1205404

#TimeUsernameProblemLanguageResultExecution timeMemory
1205404mehraliiXORanges (eJOI19_xoranges)C++20
100 / 100
100 ms13896 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using indexed_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define int long long
#define pb push_back
#define ppb pop_back
#define pf push_front
#define ppf pop_front
#define eb emplace_back
#define ins insert
#define F first
#define S second
#define MAXN 1000005
#define LOG (int)log2(MAXN)+1

const int INF = 1e18;
const int MOD = 998244353;
const double EPS = 1e-8;

struct segTree{
	struct node{
		int xor1, xor2, len;
	};

	node Merge(node a, node b){
		node res;
		res.len = a.len+b.len;
		if(a.len&1){
			res.xor1 = a.xor1 ^ b.xor2;
			res.xor2 = a.xor2 ^ b.xor1;
		} else{
			res.xor1 = a.xor1 ^ b.xor1;
			res.xor2 = a.xor2 ^ b.xor2;
		}

		return res;
	}
	
	int sz;
	vector<node> tree;

    void init_lens(int x, int lx, int rx) {
        tree[x].len = rx - lx;
        if (rx - lx == 1) return;
        int m = (lx + rx) >> 1;
        init_lens(2*x+1, lx, m);
        init_lens(2*x+2, m, rx);
    }

	segTree(int n){
		sz = 1;
		while(sz<n) sz*=2;
		tree.assign(2*sz-1, {0, 0, 0});
		init_lens(0, 0, sz);
	}

	node get(int l, int r, int x, int lx, int rx){
		if(r<=lx || rx<=l) return {0, 0, 0};
		if(l<=lx && rx<=r) return tree[x];
		int m = (lx+rx)/2;
		node s1, s2;
		s1 = get(l, r, 2*x+1, lx, m);
		s2 = get(l, r, 2*x+2, m, rx);
		return Merge(s1, s2);
	}
	
	int get(int l, int r){
		return get(l, r, 0, 0, sz).xor1;
	}
	
	void set(int i, int v, int x, int lx, int rx){
		if(rx-lx==1){
			tree[x] = {v, 0, 1};
			return;
		}
		int m = (lx+rx)/2;
		if(i<m) set(i, v, 2*x+1, lx, m);
		else set(i, v, 2*x+2, m, rx);
		tree[x] = Merge(tree[2*x+1], tree[2*x+2]);
	}
	
	void set(int i, int v){
		set(i, v, 0, 0, sz);
	}
};

void solve(){
	int n, q;
	cin >> n >> q;
	segTree sg(n);
	for(int i = 0; i < n; i++){
		int x;
		cin >> x;
		sg.set(i, x);
	}
	int t, l, r;
	while(q--){
		cin >> t >> l >> r;
		--l;
		if(t==1){
			sg.set(l, r);
		} else{
			if(!((r-l)%2)){
				cout << "0\n";
				continue;
			}
			cout << sg.get(l, r) << '\n';
		}
	}
}

signed main() {
    ios_base::sync_with_stdio(0);  cin.tie(0);  cout.tie(0);
    int t = 1;
    //cin >> t;
	for(int i = 1; i <= t; i++){
		//cout << "Case " << i << ": ";
		solve();
	}
    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...