Source Code
#include <bits/stdc++.h>
using namespace std;

int n , val[200005] , level[200005] , vis[200005] , dist[200005] , ans[200005] , par[200005]; 
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
Find a Friend Zeina.A
GNU G++17
247 ms
18.8 MB
Accepted