1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 5; int lazy[maxn<<2], tr[maxn<<2], n, q; #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 void push_down(int l, int r, int rt) { if (lazy[rt]) { int mid = (l + r) / 2; lazy[rt<<1] ^= lazy[rt]; if ((mid - l + 1) % 2) tr[rt<<1] ^= lazy[rt]; lazy[rt<<1|1] ^= lazy[rt]; if ((r - mid) % 2) tr[rt<<1|1] ^= lazy[rt]; lazy[rt] = 0; } } void push_up(int rt) { tr[rt] = (tr[rt<<1] ^ tr[rt<<1|1]); } void build(int l, int r, int rt) { if (l == r) { scanf("%d", tr + rt); return; } int mid = (l + r) / 2; build(lson); build(rson); push_up(rt); } void update(int L, int R, int x, int l, int r, int rt) { if (L <= l && r <= R) { if ((r - l + 1) % 2) tr[rt] ^= x; lazy[rt] ^= x; return; } push_down(l, r, rt); int mid = (l + r) / 2; if (L <= mid) update(L, R, x, lson); if (R > mid) update(L, R, x, rson); push_up(rt); } int query(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) return tr[rt]; push_down(l, r, rt); int mid = (l + r) / 2, res = 0; if (L <= mid) res ^= query(L, R, lson); if (R > mid) res ^= query(L, R, rson); return res; } int main() { scanf("%d", &n); build(1, n, 1); scanf("%d", &q); while (q--) { int op, l, r; scanf("%d%d%d", &op, &l, &r); if (op == 1) { int x; scanf("%d", &x); update(l, r, x, 1, n, 1); } else { printf("%d\n", query(l, r, 1, n, 1)); } } return 0; }
- 1
信息
- ID
- 28
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 3
- 上传者