sss

yhzyyy 2022-07-17 9:37:51 3 返回题目

#include #include #include #include #include using namespace std;

#define maxn 13000 struct node{ int sum; node go[2]; }t[maxn300],*root[maxn]; long long a[maxn],ans,f[120][maxn]; int num,p,x,y,z,dep,n,m;

node *insert(node *k,int x,int y){ node *tmp=&t[++num]; tmp->go[0]=k->go[0]; tmp->go[1]=k->go[1]; tmp->sum=k->sum+1; if(y<0)return tmp; tmp->go[(x&(1<<y))!=0]=insert(tmp->go[(x&(1<<y))!=0],x,y-1); return tmp; }

long long solve(node *k1,node *k2,int x,int y){ if(y<0)return 0; int p=(x&(1<<y))!=0; if(k2->go[p^1]->sum-k1->go[p^1]->sum) return (1<<y)+solve(k1->go[p^1],k2->go[p^1],x,y-1); else return solve(k1->go[p],k2->go[p],x,y-1); }

int main(){ scanf("%d%d",&n,&m); for(int i=2;i<=n+1;i++){ scanf("%lld",&a[i]); a[i]^=a[i-1]; if((int)(log(a[i])/log(2))>dep)dep=(int)(log(a[i])/log(2)); } root[0]=&t[0]; root[0]->go[0]=root[0]->go[1]=root[0]; for(int i=1;i<=n+1;i++)root[i]=insert(root[i-1],a[i],dep); p=(int)sqrt(n); n++; for(int i=1;(i-1)*p+2<=n;i++) for(int j=1;(i-1)*p+j+1<=n;j++) f[i][j]=max(f[i][j-1],solve(root[(i-1)p],root[(i-1)p+j+1],a[(i-1)p+j+1],dep)); for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); ans%=(n-1); x=(x+ans)%(n-1)+1+1; y=(y+ans)%(n-1)+1+1; if(x>y)swap(x,y); z=(x-2)/p+1; ans=0; if(y-zp-1>0)ans=f[z+1][y-zp-1]; for(int j=x-1;j<=min(zp+1,y);j++) ans=max(ans,solve(root[x-2],root[y],a[j],dep)); printf("%lld\n",ans); } return 0; }

{{ vote && vote.total.up }}