带位置信息的线性基
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int A[N];
struct Linear_Basis{
int d[30],p[30];
void ins(int x,int pos){
for(int i=29;i>=0;--i){
if((x>>i)&1){
if(d[i]==0){d[i]=x;p[i]=pos;return;}
else{
if(p[i]<pos){swap(p[i],pos),swap(d[i],x);}
x^=d[i];
}
}
}
}
int find(int pos){
int ans=0;
for(int i=29;i>=0;--i)if(p[i]>=pos&&(ans^d[i])>ans)ans^=d[i];
return ans;
}
}LB[N];
int main(){
int T;cin>>T;while(T--){
memset(LB,0,sizeof LB);
int n,m;cin>>n>>m;;
for(int i=1;i<=n;++i)scanf("%d",&A[i]);
for(int i=1;i<=n;++i)LB[i]=LB[i-1],LB[i].ins(A[i],i);
int ans=0;
while(m--){
int op,x,y;scanf("%d",&op);
if(op){
scanf("%d",&x);++n;x^=ans;LB[n]=LB[n-1];LB[n].ins(x,n);
}else{
scanf("%d%d",&x,&y);x=(x^ans)%n+1;y=(y^ans)%n+1;if(x>y)swap(x,y);
printf("%d\n",ans=LB[y].find(x));
}
}
}
}