xxx

#include<stdio.h>
#include<string.h>
//#include<iostream>
#include<algorithm>
using namespace std;

#define LL long long
int qread()
{
    char c; int s=0,t=1; while ((c=getchar())<'0' || c>'9') (c=='-') && (t=-1);
    do s=s*10+c-'0'; while ((c=getchar())>='0' && c<='9'); return s*t;
}

//

int n,m;
#define maxn 600011
int root[maxn];
struct Trie
{
    struct Node{int ls,rs,cnt;}a[maxn*26];
    int size;
    void insert(int &x,int y,int v)
    {
        int w=x=++size; a[w].cnt=1;
        for (int i=25;~i;i--)
        {
            int u=(v>>i)&1;
            a[w].ls=a[y].ls; a[w].rs=a[y].rs;
            if (u) {a[w].rs=++size; w=size; y=a[y].rs;}
            else {a[w].ls=++size; w=size; y=a[y].ls;}
            a[w].cnt=a[y].cnt+1;
        }
    }
    int query(int x,int y,int v)
    {
        int ans=0;
        for (int i=25;~i;i--)
        {
            int u=(v>>i)&1;
            if (u)
            {
                if (a[a[y].ls].cnt>a[a[x].ls].cnt)
                {
                    ans|=(1<<i);
                    y=a[y].ls; x=a[x].ls;
                }
                else y=a[y].rs,x=a[x].rs;
            }
            else
            {
                if (a[a[y].rs].cnt>a[a[x].rs].cnt)
                {
                    ans|=(1<<i);
                    y=a[y].rs; x=a[x].rs;
                }
                else y=a[y].ls,x=a[x].ls;
            }
        }
        return ans;
    }
}t;

int main()
{
    n=qread(); m=qread();
    for (int i=1,x;i<=n;i++)
    {
        x=qread();
        t.insert(root[i],root[i-1],x);
    }
    
    char c; int x,y,v;
    while (m--)
    {
        while ((c=getchar())!='A' && c!='Q');
        if (c=='A')
        {
            scanf("%d",&v);
            t.insert(root[n+1],root[n],v);
            n++;
        }
        else
        {
            scanf("%d%d%d",&x,&y,&v);
            printf("%d\n",t.query(root[x-1],root[y],v));
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Blue233333/p/9077164.html
xxx
今日推荐