1 条题解

  • 0
    @ 2023-11-7 20:03:49
    #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
    上传者