求条
查看原帖
求条
722313
Whiking楼主2024/4/12 21:09
#include <bits/stdc++.h>
//#define int long long
#define ch(i, x) tr[i].ch[x]
#define siz(i) tr[i].siz
const int N= 2e5+ 10, M= 2e5+ 10, inf= 1e9+ 10;
inline int read() {
    int x= 0, f= 1; char ch= getchar();
    for (; ! isdigit(ch); ch= getchar()) if (ch== '-') f= -1;
    for (; isdigit(ch); ch= getchar()) x= (x<< 3)+ (x<< 1)+ (ch^ 48);
    return x*= f;
}
using namespace std;
int n, m, tot, rt[N], ver, a[N];
int val[N];
struct Trie { int ch[2], siz; } tr[N];
int copynode( int k) { tr[++tot]= tr[k]; return tot; }
void ins( int k, int x) {
	for ( int i= 32; i>= 0; i--) {
		int bit= ((x>> i)& 1);
		k= copynode(k); ch(k, bit)= ++tot, siz(k)+= 1;
		k= ch(k, bit);
	} k= copynode(k); siz(k)+= 1;
}
int ask( int k1, int k2, int x) {
	int res= 0;
	for ( int i= 32; i>= 0; i--) {
		int bit= ((x>> i)& 1);
		if (siz(k2)- siz(k1)) res+= (1<< i), k1= ch(k1, bit^ 1), k2= ch(k2, bit^ 1);
		else k1= ch(k1, bit), k2= ch(k2, bit);
	} return res;
}
signed main() {
	n= read(), m= read();
	for ( int i= 1; i<= n; i++) ver++, a[ver]= a[ver- 1]^ read(), rt[ver]= rt[ver- 1], ins(rt[ver], a[ver]);
	for ( int i= 1; i<= n; i++) cout<<a[i]<<" ";
	while (m--) {
		char op[5]; scanf("%s", op); int l, r, x;
		if (op[0]== 'A') x= read(), ver++, a[ver]= a[ver- 1]^ x, rt[ver]= rt[ver- 1], ins(rt[ver], a[ver]);
		else {
			l= read(), r= read(), x= read();
			printf("%d\n", ask(rt[l- 1], rt[r], x^ a[ver]));
		}
	}
}
2024/4/12 21:09
加载中...