#include <bits/stdc++.h>
using namespace std;
int n , val[100005] , level[100005] , vis[100005] , dist[100005] , ans[100005] , par[100005];
vector<vector<int>> g;
vector<vector<pair<int,int>>> v ;
int mx = 0;
void bfs(int x){
queue<int> q ;
q.push(x) ; vis[x] = 1; level[x] = 1;
while(!q.empty()){
int node = q.front() ;
q.pop() ;
for(int i=0 ; i<g[node].size() ; i++){
if(!vis[g[node][i]]){
vis[g[node][i]] = 1 ;
q.push(g[node][i]) ;
level[g[node][i]] = level[node] + 1 ;
}
mx = level[node];
}
}
}
int main() {
cin >> n ;
g.resize(n+1) ;
for(int i=2 ; i<=n ; i++){
int pa ;
cin >> pa ;
g[pa].push_back(i) ;
g[i].push_back(pa) ;
par[i] = pa;
}
bfs(1);
for(int i=1 ; i<=n ; i++) dist[i] = ans[i] = 2e9;
for(int i=1 ; i<=n ; i++) cin >> val[i] ;
for(int i=1 ; i<=n ; i++){
if(level[i] < 5) continue;
int x = par[par[par[par[i]]]] ;
// cout << i << " " << x << endl;
if(abs(val[x] - val[i]) < dist[x]){
dist[x] = abs(val[x] - val[i]);
ans[x] = i;
}
else if(abs(val[x] - val[i]) == dist[x]){
ans[x] = min(ans[x] , i);
}
}
for(int i=1 ; i<=n ; ++i){
if(ans[i] == 2e9) ans[i]=0;
cout << ans[i] << " ";
}
return 0;
}
Copy