제출 #1219216

#제출 시각아이디문제언어결과실행 시간메모리
1219216lukasuliashviliXORanges (eJOI19_xoranges)C++20
100 / 100
375 ms11368 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, a, b) for (int i = a; i <= b; i++)
const int N = 2 * 1e5 + 5; // n is up to 2e5, so this is enough
int seg[4 * N], seg2[4 * N], a[N];

void update(int node, int l, int r, int idx, int u) {
	if (l == r) {
		seg[node] = u;
		return;
	}
	int m = (l + r) / 2;
	if (idx <= m)
		update(2 * node, l, m, idx, u);
	else
		update(2 * node + 1, m + 1, r, idx, u);
	seg[node] = seg[2 * node] ^ seg[2 * node + 1];
}

void update2(int node, int l, int r, int idx, int u) {
	if (l == r) {
		seg2[node] = u;
		return;
	}
	int m = (l + r) / 2;
	if (idx <= m)
		update2(2 * node, l, m, idx, u);
	else
		update2(2 * node + 1, m + 1, r, idx, u);
	seg2[node] = seg2[2 * node] ^ seg2[2 * node + 1];
}

int get(int node, int l, int r, int s, int e) {
	if (l > e || r < s)
		return 0;
	if (l >= s && r <= e)
		return seg[node];
	int m = (l + r) / 2;
	int val1 = get(2 * node, l, m, s, e);
	int val2 = get(2 * node + 1, m + 1, r, s, e);
	return val1 ^ val2;
}

int get1(int node, int l, int r, int s, int e) {
	if (l > e || r < s)
		return 0;
	if (l >= s && r <= e)
		return seg2[node];
	int m = (l + r) / 2;
	int val1 = get1(2 * node, l, m, s, e);
	int val2 = get1(2 * node + 1, m + 1, r, s, e);
	return val1 ^ val2;
}

signed main() {
	int n, q;
	cin >> n >> q;
	rep(i, 1, n) {
		cin >> a[i];
		update(1, 1, n, i, a[i]);
		if (i % 2 == 1)
			update2(1, 1, n, i, a[i]);
	}
	rep(i, 1, q) {
		int type;
		cin >> type;
		if (type == 2) {
			int l, r;
			cin >> l >> r;
			if ((r - l + 1) % 2 == 0) {
				cout << 0 << endl;
			} else {
				int val1 = get(1, 1, n, l, r);
				int val2 = get1(1, 1, n, l, r);
				if (l % 2 == 1) {
					cout << val2 << endl;
				} else {
					cout << (val1 ^ val2) << endl;
				}
			}
		} else {
			int l, u;
			cin >> l >> u;
			update(1, 1, n, l, u);
			if (l % 2 == 1)
				update2(1, 1, n, l, u);
		}
	}
}
#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...