如题
#include<bits/stdc++.h>
#define int long long
#define lx x<<1
#define rx x<<1|1
using namespace std;
const int maxn=1e5;
int n,q;
struct basis{
int d[35];
void insert(int x){
for(int i=32;i>=0;i--){
if(!(x&(1<<i)))continue;
if(!d[i]){
d[i]=x;
return;
}
else x^=d[i];
}
}
int query(int x){
int ans=x;
for(int i=32;i>=0;i--)ans=max(ans,ans^d[i]);
return ans;
}
void clear(){
memset(d,0,sizeof(d));
}
void operator+=(basis a){
for(int i=32;i>=0;i--)if(a.d[i])insert(a.d[i]);
}
};
struct tree{
int l,r;
basis val;
}tr[maxn<<2];
void build(int x,int l,int r){
tr[x].l=l,tr[x].r=r;
if(l==r)return ;
int mid=(l+r)>>1;
build(lx,l,mid);
build(rx,mid+1,r);
}
void add(int x,int p,int k){
tr[x].val.insert(k);
if(tr[x].l==tr[x].r)return ;
int mid=(tr[x].l+tr[x].r)>>1;
if(p<=mid)add(lx,p,k);
else add(rx,p,k);
}
basis ans;
void ask(int x,int l,int r){
if(tr[x].l>r||tr[x].r<l)return ;
if(l<=tr[x].l&&tr[x].r<=r){
ans+=tr[x].val;
return ;
}
int mid=(tr[x].l+tr[x].r)>>1;
if(mid<=r)ask(lx,l,r);if(mid>l)ask(rx,l,r);
}
signed main(){
cin>>q>>n;
build(1,1,n);
for(int i=1;i<=q;i++){
int opt,l,r;
cin>>opt>>l>>r;
if(opt==1){
add(1,l,r);
}
else{
ans.clear();
ask(1,l,r);
cout<<ans.query(0)<<'\n';
}
}
return 0;
}