#2 挂了,求dalao救救
查看原帖
#2 挂了,求dalao救救
62573
zzqDeco楼主2020/7/7 09:13
#include <iostream>
#include <cstdio>

using namespace std;

struct segment
{
  int lson,rson;
  int cnt;
}tree[20000010];

int n,m;

int root[600010],xorsum,con,num;

int modify(int last,int val,int lv)
{
  int now=++num;
  if(lv<0) return now;
  if(((val>>lv)&1)==1)
  {
    tree[now].lson=tree[last].lson;
    tree[now].rson=modify(tree[last].rson,val,lv-1);
    tree[tree[now].rson].cnt=tree[tree[last].rson].cnt+1;
  }
  else
  {
    tree[now].rson=tree[last].rson;
    tree[now].lson=modify(tree[last].lson,val,lv-1);
    tree[tree[now].lson].cnt=tree[tree[last].lson].cnt+1;
  }
  return now;
}

int find(int ver_l,int ver_r,int val,int lv)
{
  if(lv<0) return 0;
  if(((val>>lv)&1)==0)
  {
    if(tree[tree[ver_r].rson].cnt>tree[tree[ver_l].rson].cnt)
    {
      return (1<<lv)+find(tree[ver_l].rson,tree[ver_r].rson,val,lv-1);
    }
    else
    {
      return find(tree[ver_l].lson,tree[ver_r].lson,val,lv-1);
    }
  }
  else
  {
    if(tree[tree[ver_r].lson].cnt>tree[tree[ver_l].lson].cnt)
    {
      return (1<<lv)+find(tree[ver_l].lson,tree[ver_r].lson,val,lv-1);
    }
    else
    {
      return find(tree[ver_l].rson,tree[ver_r].rson,val,lv-1);
    }
  }
}

int main()
{
  scanf("%d%d",&n,&m);
  root[0]=0;
  tree[0].lson=0;
  tree[0].rson=0;
  tree[0].cnt=0;
  root[con+1]=modify(root[0],0,24);
  con++;
  for(int i=1;i<=n;i++)
  {
    int now;
    scanf("%d",&now);
    root[con+1]=modify(root[con],xorsum^now,24);
    con++;
    xorsum^=now;
  }
  for(int i=1;i<=m;i++)
  {
    char ch[3];
    scanf("%s",ch);
    if(ch[0]=='A')
    {
      int x;
      scanf("%d",&x);
      root[con+1]=modify(root[con],xorsum^x,24);
      con++;
      xorsum^=x;
    }
    else if(ch[0]=='Q')
    {
      int l,r,x;
      scanf("%d%d%d",&l,&r,&x);
      if(l-1>0) printf("%d\n",find(root[l-1],root[r],xorsum^x,24));
      else printf("%d\n",find(root[1],root[r],xorsum^x,24));
    }
  }
}

2020/7/7 09:13
加载中...