题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值
题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后用线段树维护线性基
#include<bits/stdc++.h> using namespace std; #define LL long long #define maxn 100009 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 int read() { char ch=' '; ; ') ch=getchar(); ') { ans=ans*+ch-'; ch=getchar(); } return ans; } struct ac{ ]; void init(){ memset(a,,sizeof(a)); } bool add(int x){ ;j>=;j--){ <<j)){ if(!a[j]){ a[j]=x; break; } x^=a[j]; } } ; } int query(){ ; ;j>=;j--){ if((x^a[j])>x){ x^=a[j]; } } return x; } ac merge_LB(ac x){ ac ret; ;i<=;i++){ ret.a[i]=a[i]; } ;i<=;i++){ ret.add(x.a[i]); } return ret; } }tre[maxn*]; int b[maxn]; void build(int l,int r,int in){ tre[in].init(); if(l==r){ tre[in].add(b[l]); return ; } ; build(l,mid,); build(mid+,r,+); tre[].merge_LB(tre[+]); } ac query(int l,int r,int x,int y,int in){ if(l==x&&r==y){ return tre[in]; } ; //ac ret;ret.init(); )); ,y,+)); ).merge_LB(query(mid+,r,mid+,y,+)); } int main(){ int t; cin>>t; while(t--){ int n,m,k; //scanf("%d%d%d",&n,&m,&k); n=read();m=read();k=read(); k=~k; ;j<=n;j++){ scanf("%d",&b[j]); b[j]&=k; } k=~k; build(,n,); ;j<m;j++){ int l,r; //scanf("%d%d",&l,&r); l=read();r=read(); ac ans=query(l,r,,n,); int an=ans.query(); an|=k; printf("%d\n",an); } } }