1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #include <iostream> #include <cstdio>
using namespace std;
const int N = 100010;
struct node { int l, r, w, ww; };
int a, b, x, y, ans; node tree[4 * N];
void build(int k, int lef, int rig) { tree[k].l = lef, tree[k].r = rig; if (tree[k].l == tree[k].r) { if (0 == tree[k].l % 2) { tree[k].w = 0, scanf("%d", &tree[k].ww); } else { tree[k].ww = 0, scanf("%d", &tree[k].w); } return; } int mid = (lef + rig) / 2; build(k * 2, lef, mid); build(k * 2 + 1, mid + 1, rig); tree[k].w = tree[k * 2].w ^ tree[k * 2 + 1].w; tree[k].ww = tree[k * 2].ww ^ tree[k * 2 + 1].ww; }
void change_point(int k) { if (tree[k].l == tree[k].r) { if (tree[k].l % 2 == 0) tree[k].ww = y; else tree[k].w = y; return; } int mid = (tree[k].l + tree[k].r) / 2; if (x <= mid) change_point(2 * k); else change_point(2 * k + 1); tree[k].w = tree[2 * k].w ^ tree[2 * k + 1].w; tree[k].ww = tree[2 * k].ww ^ tree[2 * k + 1].ww; }
void ask_interval(int k) { if (tree[k].l >= a && tree[k].r <= b) { if (0 == a % 2) ans ^= tree[k].ww; else ans ^= tree[k].w; return; } int mid = (tree[k].l + tree[k].r) / 2; if (a <= mid) ask_interval(2 * k); if (b > mid) ask_interval(2 * k + 1); }
int main() { int T, t, n, q, icas = 0; scanf("%d", &T); while (T--) { printf("Case #%d:\n", ++icas); scanf("%d%d", &n, &q), build(1, 1, n); while (q--) { scanf("%d", &t); if (0 == t) { scanf("%d%d", &x, &y); change_point(1); } else { ans = 0, scanf("%d%d", &a, &b); if (a % 2 == b % 2) ask_interval(1); printf("%d\n", ans); } } } return 0; }
|