小学生fhqTLE#16求助qwq
查看原帖
小学生fhqTLE#16求助qwq
716260
SegmentTree_楼主2024/6/29 00:25
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5+5;
struct node{
	int ls, rs;
	int key, pri, siz;
	int lazy;
	int val;
	int sum;
}treap[N * 20];
int tsiz = 0, root[25];
void update(int rt){
	treap[rt].siz = treap[treap[rt].ls].siz + treap[treap[rt].rs].siz + 1;
	treap[rt].sum = treap[rt].val + treap[treap[rt].ls].sum + treap[treap[rt].rs].sum;
}
void pushdown(int x){
	if (x && treap[x].lazy){
		treap[treap[x].ls].lazy ^= treap[x].lazy;
		treap[treap[x].rs].lazy ^= treap[x].lazy;
		treap[treap[x].ls].val ^= treap[x].lazy;
		treap[treap[x].rs].val ^= treap[x].lazy;
		treap[treap[x].ls].sum = treap[treap[x].ls].siz - treap[treap[x].ls].sum;
		treap[treap[x].rs].sum = treap[treap[x].rs].siz - treap[treap[x].rs].sum;
		treap[x].lazy = 0;
	}
}
void newnode(int x, int v){
	++tsiz;
	treap[tsiz].siz = 1;
	treap[tsiz].ls = treap[tsiz].rs = 0;
	treap[tsiz].key = x;
	treap[tsiz].pri = rand();
	treap[tsiz].val = v;
	treap[tsiz].lazy = 0;
}
void split(int rt, int x, int &l, int &r){
	if (rt == 0){
		l = r = 0;
		return;
	}
	pushdown(rt);
	if (treap[treap[rt].ls].siz < x) l = rt, split(treap[rt].rs, x - treap[treap[rt].ls].siz - 1, treap[rt].rs, r);
	else r = rt, split(treap[rt].ls, x, l, treap[rt].ls);
	update(rt);
}
int merge(int l, int r){
	if (l == 0 || r == 0) return l + r;
	if (treap[l].pri > treap[r].pri){
		pushdown(l);
		treap[l].rs = merge(treap[l].rs, r);
		update(l);
		return l;
	}
	else{
		pushdown(r);
		treap[r].ls = merge(l, treap[r].ls);
		update(r);
		return r;
	}
}
int insert(int rt, int x, int v){
	int l, r;
	split(root[rt], x, l, r);
	newnode(x, v);
	root[rt] = merge(merge(l, tsiz), r);
	return tsiz;
}
void print(int x){
	if (!x) return;
	pushdown(x);
	print(treap[x].ls);
	cout << treap[x].key << ' ';
	print(treap[x].rs);
}
void add(int rt, int l, int r, int x){
	int a, b, c;
	split(root[rt], l - 1, a, b);
	split(b, r - l + 1, b, c);
	treap[b].lazy ^= x;
	treap[b].val ^= x;
	if (x) treap[b].sum = treap[b].siz - treap[b].sum;
	root[rt] = merge(a, merge(b, c));
}
int query(int rt, int l, int r){
	int a, b, c;
	split(root[rt], l - 1, a, b);
	split(b, r - l + 1, b, c);
	ll ans = treap[b].sum;
	root[rt] = merge(a, merge(b, c));
	return ans;
}
int n, q;
signed main(){
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	srand(time(NULL));
	cin >> n;
	for (int i = 1;i <= n;i++){
		int v;
		cin >> v;
		for (int j = 1;j <= 20;j++){
			int a = ((v >> (j - 1)) & 1);
			insert(j, i, a);
		}
	}
	cin >> q;
	while (q--){
		int op, l, r, k;
		cin >> op >> l >> r;
		if (op == 1){
			ll ans = 0;
			for (int i = 1;i <= 20;++i){
				ll a = query(i, l, r);
				ans += (1 << (i - 1)) * a;
			}
			cout << ans << '\n';
		}
		else{
			cin >> k;
			for (int i = 1;i <= 20;++i){
				int a = ((k >> (i - 1)) & 1);
				if (a) add(i, l, r, a);
			}
		}
	}
	return 0;
}
2024/6/29 00:25
加载中...