#include<bits/stdc++.h>
#define db double
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
#define ll long long
using namespace std;
bool MBE;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int mxn=5e5+10;
int p1[mxn],p2[mxn],n,cnt=1,ch[mxn*60][2],cnt1,cnt2,num[mxn],fa[mxn];
ll mx=0,a[mxn],anss[mxn];
bool vis[mxn];
vector<int>E[mxn];
pii ans;
void insert(ll x,int id){
int now=1;
for(int i=59;i>=0;i--){
ll pos=(x>>(i*1ll))&1ll;
if(!ch[now][pos])ch[now][pos]=++cnt;
now=ch[now][pos];
}
num[now]=id;
}
void query(ll x,int id){
int now=1;
ll s=0;
for(int i=59;i>=0;i--){
ll pos=(x>>(i*1ll))&1ll;
if(!ch[now][pos^1])now=ch[now][pos];
else now=ch[now][pos^1],s+=(1ll<<i);
}
if(s>mx)mx=s,ans=mkp(num[now],id);
}
void dfs(int u){
insert(a[u],u);
query(a[u],u);
for(int v:E[u])
dfs(v);
}
void init(){
for(int i=1;i<=cnt;i++)
ch[i][0]=ch[i][1]=num[i]=0;
cnt=1;mx=0;
}
void solve(int u,int now,int *p,bool op){
if(op)anss[u]=mx;
insert(a[u],u);
query(a[u],u);
if(!op){
for(int v:E[u])
solve(v,now,p,0);
return;
}
if(now==1)return;
for(int v:E[u])
if(v!=p[now-1])solve(v,now-1,p,0);
solve(p[now-1],now-1,p,1);
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
n=read();
for(int i=2;i<=n;i++){
fa[i]=read();
E[fa[i]].eb(i);
}
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
dfs(1);
int u=ans.fi,v=ans.se;
int x=u,y=v;
while(x){
p1[++cnt1]=x;
x=fa[x];
vis[x]=1;
}
while(y){
p2[++cnt2]=y;
y=fa[y];
vis[y]=1;
}
for(int i=1;i<=n;i++)
if(!vis[i])anss[i]=mx;
init();
solve(1,cnt1,p1,1);
init();
solve(1,cnt2,p2,1);
for(int i=1;i<=n;i++)
printf("%lld\n",anss[i]);
bool MED;
cerr<<(&MED-&MBE)/1048576.0<<" MB, "<<1000*clock()/CLOCKS_PER_SEC<<" ms\n";
return 0;
}