1.Problem
F - Range Xor Query (atcoder.jp)
2.Idea
XOR segtree
3.Source
Int seg[1 << 20];
void set_value(Int pos, Int val) {
pos += 1 << 19;
seg[pos] = seg[pos] ^ val;
while ((pos /= 2) > 0) {
seg[pos] = seg[pos * 2] ^ seg[pos * 2 + 1];
}
}
Int get_xor(int ql, int qr, int sl = 0, int sr = 1 << 19, int pos = 1) {
//no overlap
if (qr <= sl || sr <= ql) return 0;
//fit in the segment
if (ql <= sl && sr <= qr) return seg[pos];
//partially overlap
Int sm = (sl + sr) / 2;
Int lxor = get_xor(ql, qr, sl, sm, pos * 2);
Int rxor = get_xor(ql, qr, sm, sr, pos * 2 + 1);
return lxor ^ rxor;
}
void solve()
{
Int n, q, t, x, y;
cin >> n >> q;
for (int i = 0; i < n; i++) {
int x; cin >> x;
set_value(i, x);
}
for (int i = 0; i < q; i++) {
cin >> t >> x >> y;
if (t == 1) {
set_value(x - 1, y);
}
else {
cout << get_xor(x - 1, y) << endl;
}
}
}
No comments:
Post a Comment