Pagini recente » Monitorul de evaluare | Painting | Cod sursa (job #433564) | Istoria paginii runda/simulare_oji_11_12_1/clasament | Cod sursa (job #3191491)
#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;
}