题解:

考虑到是异或,那么就是位运算

位运算会想到什么?当然是按位拆开

那么就变成了一个个的字符串

考虑了trie

可是貌似有多个问题

那么就用可持久化trie!

代码:

#include<bits/stdc++.h> 
using namespace std;
const int N=50005,M=1550005,L=30;
int tot,n,q,son[M][2],sum[M],root[N],bz[L+5];
int read()
{
    int x=0;char c;
    for (c=getchar();c<'0'||c>'9';c=getchar());
    for (;c>='0'&&c<='9';c=getchar())x=x*10+c-48;
    return x;
}
void insert(int v,int &x,int y)
{
    x=++tot;
    memcpy(son[x],son[y],8);
    sum[x]=sum[y]+1;
    if (!v) return;
    insert(v-1,son[x][bz[v-1]],son[y][bz[v-1]]);
}
int find(int v,int x,int y)
{
    if (!v) return 0;
    if (sum[son[x][bz[v-1]]]>sum[son[y][bz[v-1]]])
     return find(v-1,son[x][bz[v-1]],son[y][bz[v-1]])+(1<<(v-1));
    return find(v-1,son[x][1-bz[v-1]],son[y][1-bz[v-1]]);
}
int main()
{
    n=read();q=read();
    for (int i=1;i<=n;i++)
     {
        int x=read();
        for (int j=0;j<L;x/=2)bz[j++]=x%2;
        insert(L,root[i],root[i-1]);
     }
    while (q--)
     {
        int x=read(),l=read(),r=read();
        for (int j=0;j<L;x/=2)bz[j++]=1-(x%2);
        printf("%d\n",find(L,root[r+1],root[l]));
     }
}

 

posted on 2017-09-20 19:23  宣毅鸣  阅读(122)  评论(0编辑  收藏  举报