#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 500005
int n;ll a[N];
int tot,head[N];
struct Edge{int next,to;}e[N<<1];
void add_edge(int u,int v){e[++tot]={head[u],v},head[u]=tot;}
namespace trie
{
#define _ 60
int idx=1,tr[N*_],ls[N*_],rs[N*_];
void clear()
{
memset(ls,0,idx+1<<2);
memset(rs,0,idx+1<<2);
memset(tr,0,idx+1<<2);
idx=1;
}
void insert(ll x,int id)
{
int p=1;
for(int i=_;~i;i--)
{
int c=(x>>i&1),*nxt=c?(&rs[p]):(&ls[p]);
if(!(*nxt)) *nxt=++idx;p=*nxt;
}
tr[p]=id;
}
pair<ll,int> query(ll x)
{
int p=1;ll ret=0;
for(int i=_;~i;i--)
{
int c=(x>>i&1),*nxt=c?(&ls[p]):(&rs[p]),*ano=c?(&rs[p]):(&ls[p]);
if(*nxt) ret|=(1ll<<i),p=*nxt;else p=*ano;
}
return {ret,tr[p]};
}
}using namespace trie;
int fa[N],dep[N];
ll fans,ans;int U,V;
void dfs1(int u)
{
insert(a[u],u);pair<ll,int> val=query(a[u]);
if(val.first>ans) U=u,V=val.second,fans=val.first;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;fa[v]=u;
dep[v]=dep[u]+1;dfs1(v);
}
}
int lca,bk[N];
void LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
while(dep[x]>dep[y]) bk[x]=1,x=fa[x];
while(x!=y) bk[x]=1,bk[y]=2,x=fa[x],y=fa[y];
lca=x;while(x) bk[x]=3,x=fa[x];
}
ll Ans[N];
#define insrt(x) insert(a[x],x),ans=max(ans,query(a[x]).first)
void dfs2(int u,int flag)
{
if(!bk[u]) Ans[u]=fans;
if(bk[u]==flag||bk[u]==3) Ans[u]=ans;
insrt(u);int son=0;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if((bk[v]^flag)&&(bk[v]^3)) dfs2(v,flag);
else son=v;
}
if(son) dfs2(son,flag);
}
int main()
{
scanf("%d",&n);
for(int i=2,x;i<=n;i++) scanf("%d",&x),add_edge(x,i);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
dfs1(1);LCA(U,V);
clear();ans=0;dfs2(1,1);
clear();ans=0;dfs2(1,2);
for(int i=1;i<=n;i++) printf("%lld\n",Ans[i]);
}
疑似过了链的测试点和 ai≤100 的点。