Source Code
#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
Find a Friend Zeina.A
GNU G++17
3 ms
812 KB
Wrong Answer