題目
老年選手打不對線性基了。
考慮維護前綴線性基並且讓線性基高位的基底是由儘量靠後的數構成的,存個位置貪心選即可。
AC Code:
#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
int n,m,a[maxn];
struct Set{
int a[30],p[30];
void init(){ memset(a,0,sizeof a) , memset(p,0,sizeof p); }
void insert(int x,int ps){
for(int i=29;i>=0;i--)
if(x>>i&1){
if(!a[i]){
a[i] = x , p[i] = ps;
return;
}
else{
if(p[i] < ps)swap(a[i],x) , swap(p[i] , ps);
x ^= a[i];
}
}
}
int query(int l){
int ret = 0;
for(int i=29;i>=0;i--)
if(a[i] && l<=p[i])
ret = max(ret , ret ^ a[i]);
return ret;
}
}st[maxn];
int main(){
int T;
for(scanf("%d",&T);T--;){
scanf("%d%d",&n,&m);
memset(st,0,sizeof st);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i>1) st[i] = st[i-1];
else st[i].init();
st[i].insert(a[i],i);
}
int ans = 0;
for(int i=1;i<=m;i++){
int op , l , r;
scanf("%d%d",&op,&l);
if(op){
l ^= ans;
a[++n] = l;
st[n] = st[n-1] , st[n].insert(l,n);
}
else{
scanf("%d",&r);
l = (l^ans) % (n) + 1 , r = (r^ans) % (n) + 1;
if(l > r) swap(l,r);
printf("%d\n",ans = st[r].query(l));
}
}
}
}