原题CF1110F,详见
感谢 爱吃饼的猴子 指出的错误,现已改正
#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return
#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
template<class T> void _deb(const char *name,T val){
cout<<name<<val<<endl;
}
const int maxn=1e6+5;
int N,M;
int LB[maxn][32],pos[maxn][32];
inline void copy(int k);
void insert(int x,int k);
int main(){
int T;
scanf("%d",&T);
while(T--){
int cnt=0,temp;
scanf("%d%d",&N,&M);
rep(i,1,N+1){
scanf("%d",&temp);
cnt++;
copy(cnt);
insert(temp,cnt);
}
int lastans=0;
rep(i,0,M){
int op;
scanf("%d",&op);
switch(op){
case 0:
{ int l,r;
scanf("%d%d",&l,&r);
//decode
l=(l^lastans)%cnt+1;
r=(r^lastans)%cnt+1;
if(l>r)
swap(l,r);
int ans=0;
drep(i,30,0){
if(l<=pos[r][i]){
ans=max(ans,ans^LB[r][i]);
}
}
lastans=ans;
printf("%d\n",ans);
break;
}
case 1:
scanf("%d",&temp);
cnt++;
copy(cnt);
insert(temp^lastans,cnt);
break;
}
}
}
re 0;
}
inline void copy(int k){
rep(i,0,31){
LB[k][i]=LB[k-1][i];
pos[k][i]=pos[k-1][i];
}
}
void insert(int x,int k){
int r=k;
drep(i,30,0){
if(x&(1<<i)){
if(!LB[r][i]){
LB[r][i]=x;
pos[r][i]=k;
return;
}
if(pos[r][i]<k){
swap(LB[r][i],x);
swap(pos[r][i],k);
}
x^=LB[r][i];
}
}
}