题目传送门
分析
看到查询最大异或和,果断想到线性基,又看到了区间操作,果断想到线段树。
于是就有了线段树套线性基。
对于插入操作,我们可以对线段树上对应的点的线性基直接插入。
对于询问操作,我们可以将区间内的线性基并在一块查询。
代码如下
#include<bits/stdc++.h>
using namespace std;
int read(){
int x;scanf("%d",&x);return x;
}
const int N = 5e4+100;
int n,m;
struct Node{
int p[34];
int size;
Node(){size = 0;}
}t[N<<2];
int Ans[34],size;
void update(int u,int l,int r,int K,int x)
{
if(l > K || r < K) return;
int key = x;
if(t[u].size < 31)
{
for(int i = 31;i>=0;i--)
{
if(key&(1<<i))
{
if(!t[u].p[i])
{
t[u].p[i] = key;
t[u].size++;
break;
}
key ^= t[u].p[i];
}
}
}
if(l == r) return;
int mid = l + r >> 1;
update(u<<1,l,mid