线性基
与这道题是一样的思路,只是改成了强制在线,这样解题的思路只能是预处理来做了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 5e5+5;
int T;
int n,m;
int a[maxn];
int r[2*maxn][35],b[2*maxn][35];
int lastans;
void add(int i,int x) {
for(int j=30; j>=0; j--) {
r[i][j]=r[i-1][j];
b[i][j]=b[i-1][j];
}
int k = i,t = x;
for(int j=30; j>=0; j--) {
if((t>>j)&1) {
if(!b[i][j]) {
r[i][j]=k;
b[i][j]=t;
break;
}
if(k>r[i][j]) {
swap(k,r[i][j]);
swap(t,b[i][j]);
}
t^=b[i][j];
}
}
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
add(i,a[i]);
}
lastans=0;
while(m--){
int op,x,y;
scanf("%d",&op);
if(!op){
scanf("%d%d",&x,&y);
x = (x^lastans)%n+1;
y = (y^lastans)%n+1;
if(x>y)swap(x,y);
lastans=0;
for(int i=30;i>=0;i--){
if(r[y][i]>=x){
lastans = max(lastans,b[y][i]^lastans);
}
}
printf("%d\n",lastans);
}else{
scanf("%d",&x);
x^=lastans;
add(++n,x);
}
}
}
return 0;
}