Submission #466146

#TimeUsernameProblemLanguageResultExecution timeMemory
466146StickfishXORanges (eJOI19_xoranges)C++17
100 / 100
633 ms7112 KiB
#include <iostream>
#include <vector>
using namespace std;

struct stree{
	void resize(int n){
		sz = 1;
		while(sz < n)sz <<= 1;
		t.assign(sz * 2 - 1, 0);
	}

	void xori(int i, int x){
		i += sz - 1;
		while(true){
			t[i] ^= x;
			i = (i - 1) / 2;
			if(i == 0)
				return;
		}
	}

	int get(int l, int r){
		l += sz - 1;
		r += sz - 2;
		int ans = 0;
		while(l <= r){
			if(l % 2 == 0)
				ans ^= t[l];
			l = l / 2;
			if(r % 2)
				ans ^= t[r];
			r = r / 2 - 1;
		}
		return ans;
	}
private:
	int sz;
	vector<int> t;
};

const int MAXN = 2e5 + 123;
int a[MAXN];

signed main(){
	int n, q;
	cin >> n >> q;
	stree sodd;
	stree seven;
	sodd.resize(n);
	seven.resize(n);
	for(int i = 0; i < n; ++i){
		cin >> a[i];
		if(i % 2){
			sodd.xori(i, a[i]);
		} else {
			seven.xori(i, a[i]);
		}
	}
	while(q--){
		int t;
		cin >> t;
		if(t == 1){
			int i, x;
			cin >> i >> x;
			--i;
			if(i % 2)
				sodd.xori(i, a[i] ^ x);
			else
				seven.xori(i, a[i] ^ x);
			a[i] = x;
		} else {
			int l, r;
			cin >> l >> r;
			--l;
			if((r - l) % 2 == 0){
				cout << 0 << '\n';
				continue;
			}
			int ans = 0;
			if(l % 2)
				ans = sodd.get(l, r);
			else
				ans = seven.get(l, r);
			cout << ans << '\n';
		}
	}
}
#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...