#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int a[N],root[N],s[N*35][2],c[N*35],tot,sz[N],id[N],ord;
vector<int> adj[N];
void update(int &rt,int last,int x,int d)
{
rt=++tot;
s[rt][0]=s[last][0];
s[rt][1]=s[last][1];
c[rt]=c[last]+1;
if(d==-1) return ;
int b=(x>>d)&1;
if(b^1) update(s[rt][0],s[last][0],x,d-1);
else update(s[rt][1],s[last][1],x,d-1);
}
void dfs(int u,int p)
{
id[u]=++ord;
sz[u]=1;
update(root[ord],root[ord-1],a[u],29);
for(int v : adj[u])
{
if(v==p) continue;
dfs(v,u);
sz[u]+=sz[v];
}
}
int query(int rt1,int rt2,int x,int d,int res)
{
if(d==-1) return res;
int b=((x>>d)&1)^1;
int val=c[s[rt2][b]]-c[s[rt1][b]];
if(val) return query(s[rt1][b],s[rt2][b],x,d-1,res|(1<<d));
else return query(s[rt1][b^1],s[rt2][b^1],x,d-1,res);
}
int main()
{
int n,q;
while(~scanf("%d%d",&n,&q))
{
for(int i=1;i<=n;++i) adj[i].clear();
memset(s,0,sizeof(s));
memset(c,0,sizeof(c));
ord=tot=0;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int u=2;u<=n;++u)
{
int v;
scanf("%d",&v);
adj[v].push_back(u);
}
dfs(1,0);
while(q--)
{
int x,y;
scanf("%d%d",&y,&x);
printf("%d\n",query(root[id[y]-1],root[id[y]+sz[y]-1],x,29,0));
}
}
return 0;
}
HDU - 6191 - Query on A Tree (可持久化Trie)
最新推荐文章于 2020-10-13 20:54:56 发布