Pagini recente » Cod sursa (job #3362162) | Cod sursa (job #3361909) | Cod sursa (job #3362610) | Cod sursa (job #3362233) | Cod sursa (job #3362142)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
vector <int> k;
vector <vector<int>> arbore;
vector <int> ans;
vector <int> stack;
void dfs(int nod) {
stack.push_back(nod);
if (k[nod] == 0) {
ans[nod] = 0;
} else {
int stramos = stack[stack.size() - 1 - k[nod]];
ans[nod] = ans[stramos] + 1;
}
for (int i = 0; i < arbore[nod].size(); i++) {
dfs(arbore[nod][i]);
}
stack.pop_back();
}
int main() {
int n;
fin >> n;
k.resize(n + 1);
arbore.resize(n + 1);
ans.resize(n + 1);
for (int i = 1; i <= n; i++) {
fin >> k[i];
}
vector <int> tata(n + 1, 0);
int a, b;
for (int i = 1; i < n; i++) {
fin >> a >> b;
arbore[a].push_back(b);
tata[b] = a;
}
int root = 1;
for (int i = 1; i <= n; i++) {
if (tata[i] == 0) {
root = i;
break;
}
}
dfs(root);
for (int i = 1; i <= n; i++) {
fout << ans[i] << ' ';
}
fout << '\n';
return 0;
}