Source Code
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10; 
int a[N], b[N], rankk[N];
map<int,vector<pair<int, int>>>mp; 
int main() {
	
	int n; 
	cin>>n;
	a[1] = 0;  
	for (int i = 2; i <= n; ++i) {
		cin>>a[i];
	}
	
	for(int i = 2; i <= n; ++i) {
		rankk[i] = rankk[a[i]]+1;
	}
	for (int i = 1; i <=n; ++i) {
		cin>>b[i];
	}
	for (int i = 1; i <= n; ++i) {
		mp[rankk[a[i]]].push_back({b[i], i});
		
	}
	for (int i = 1; i <= n; ++i) {
		if (mp.find(i) != mp.end()) {
			sort(mp[i].begin(), mp[i].end());
		}
	}
	vector<int> ans; 
	for (int i = 1; i <= n; ++i) {
	
		if(mp.find(rankk[i]) == mp.end() || mp.find(rankk[i]+3) == mp.end()) {
			ans.push_back(0);
		}else {
			// cout<<i<<" "<<rankk[i]<<" "<<mp[rankk[i]+3].size()<<endl;
			// for(auto w : mp[rankk[i]+3] )
			// cout << w.first <<" " << w.second <<" ";
			// cout <<"\n";
			pair<int,int> tmp = make_pair(b[i],-1);
			auto up = lower_bound(mp[rankk[i]+3].begin(), mp[rankk[i]+3].end(), tmp);
			auto low = up;
			pair<int, int> x = {-1, -1};
			if(up != mp[rankk[i]].end()) {
				x = make_pair(abs(up->first - b[i]), up->second);
				// cout<<"up: "<<up->second<<endl;
			}
			if (low != mp[rankk[i]].begin()){
				--low;
				if (abs((low -> first) - b[i]) < x.first ) {
					x = make_pair(abs((low -> first) - b[i]), low->second);
					
				}
				// cout<<"low: "<<low->second<<endl;
			}
			ans.push_back(x.second);
		}
	}
/*	for (auto i : mp) {
		int x = i.first;
		vector<pair<int, int>> y = i.second;
		cout<<x<<" "<<endl;
		for (int j = 0; j<y.size(); ++j) {
			int emp
			cout<<y[j].first<<" "<<y[j].second<<endl;
			rank[y[j].first] = rank[x]+1;
		}
	}
*/
cout<<ans[0];
for (int i = 1; i< ans.size(); ++i) {
	cout<<" "<<ans[i];
}
	return 0;
}
Copy
Find a Friend Chicou
GNU G++17
3 ms
728 KB
Wrong Answer