这题是隔壁Ebola大佬出的,%%%Ebola
Ebola大帝万寿无疆
用线段树维护线性基就行
代码实现也很简单
#include <bits/stdc++.h>
#define il inline
#define getchar() (tt==ss&&(tt=(ss=In)+fread(In,1,Max,stdin),tt==ss)?EOF:*ss++)
#define Max 100005
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
char In[Max],*ss=In,*tt=In;
struct node
{
int b[65];
il void add(int x)
{
bool res=1;
for(int i=31;i>=0;i--)
{
res=res&&b[i];
if(!(x>>i)) continue;
if(!b[i])
{
b[i]=x;
return;
}
x^=b[i];
}
return;
}
il void add(node x)
{
for(int i=31;i>=0;i--)
{
if(x.b[i])
add(x.b[i]);
}
}
}t[Max<<2],ans;
il int read()
{
char c=getchar();
int x=0,f=1;
while(c>'9'||c<'0')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int n,m;
il void ins(int x,int l,int r,int k,int p)
{
t[x].add(p);
if(l==r) return;
int mid=(l+r)>>1;
if(k<=mid) ins(ls(x),l,mid,k,p);
else ins(rs(x),mid+1,r,k,p);
}
il void qry(int x,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
ans.add(t[x]);
return;
}
int mid=(l+r)>>1;
if(ql<=mid) qry(ls(x),l,mid,ql,qr);
if(qr>mid) qry(rs(x),mid+1,r,ql,qr);
}
il void clear()
{
memset(ans.b,0,sizeof(ans.b));
}
il int getans()
{
int res=0;
for(int i=31;i>=0;i--)
{
if((res^ans.b[i])>res) res^=ans.b[i];
}
return res;
}
int main()
{
n=read(),m=read();
while(n--)
{
int opt=read(),x=read(),y=read();
if(opt==1)
{
ins(1,1,m,x,y);
}
if(opt==2)
{
clear();
qry(1,1,m,x,y);
printf("%d\n",getans());
}
}
}
最后一次更新于2021-09-28 02:19:45
0 条评论