Cod sursa(job #3191491)

Utilizator livliviLivia Magureanu livlivi Data 9 ianuarie 2024 20:09:18
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("cerere.in");
ofstream cout("cerere.out");

void dfs(int node, vector<vector<int>>& sons, vector<int>& k, vector<int>& stk, vector<int>& dp) {
	stk.push_back(node);
	dp[node] = dp[stk[stk.size() - 1 - k[node]]] + 1;

	for (auto next : sons[node]) {
		dfs(next, sons, k, stk, dp);
	}

	stk.pop_back();
}

void Solve() {
	int n; cin >> n;
	
	vector<int> k(n);
	int root = 0;
	for (int i = 0; i < n; i++) {
		root ^= i;
		cin >> k[i];
	}

	vector<vector<int>> sons(n);
	for (int i = 1; i < n; i++) {
		int a, b; cin >> a >> b; a--; b--;
		sons[a].push_back(b);
		root ^= b;
	}

	vector<int> dp(n, -1);
	vector<int> stk;
	dfs(root, sons, k, stk, dp);

	for (int i = 0; i < n; i++) {
		cout << dp[i] << " ";
	}
	cout << "\n";
}

int main() {
	Solve();
	return 0;
}