#include <bits/stdc++.h>
using namespace std;
int n , val[100005] , level[100005] , vis[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 par ;
cin >> par ;
g[par].push_back(i) ;
g[i].push_back(par) ;
}
bfs(1);
v.resize(mx + 1);
for(int i=1 ; i<=n ; i++) cin >> val[i];
for(int i=1 ; i<=n ; i++){
v[level[i]].push_back({val[i] , i});
}
for(int i=1 ; i<=mx ; i++) sort(v[i].begin() , v[i].end());
// for(int i=1 ; i<=n ; i++) cout << level[i] << " ";
for(int i=1 ; i<=n ; i++){
if(level[i] + 4 > mx){
cout << 0 << " " ;
continue;
}
if(v[level[i]+4].size() == 1){
cout << v[level[i]+4][0].second << " " ;
continue;
}
pair<int,int> p = make_pair(val[i] , -1e9);
int idx = lower_bound(v[level[i]+4].begin() , v[level[i]+4].end() , p) - v[level[i]+4].begin();
if(idx == 0) cout << v[level[i]+4][0].second << " " ;
else if(idx == v[level[i]+4].size()) cout << v[level[i]+4].back().second << " " ;
else{
int siz = v[level[i] + 4].size();
int dist1 = v[level[i]+4][idx].first - val[i] , dist2 = v[level[i]+4][idx-1].first - val[i];
if(abs(dist1) >= abs(dist2)){
cout << v[level[i]+4][idx-1].second << " ";
}
else{
cout << v[level[i]+4][idx].second << " ";
}
}
}
return 0;
}
Copy