Pagini recente » Cod sursa (job #3362048) | Cod sursa (job #3362087) | Cod sursa (job #3362085) | Cod sursa (job #3361608) | Cod sursa (job #3362159)
#include <bits/stdc++.h>
#define MAXN 1000000
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int is_root[MAXN + 1], ki[MAXN + 1], helper[MAXN + 1], not_stiva[MAXN + 1], mem[MAXN + 1], ind;
vector <int> graf[MAXN + 1];
void DFS(int nod){
int vec, i;
helper[nod] = not_stiva[ind - ki[nod]];
for(i = 0; i < graf[nod].size(); i++){
vec = graf[nod][i];
not_stiva[++ind] = vec;
DFS(vec);
ind--;
}
}
int calc(int i){
if(mem[i] == -1){
if(helper[i] == i){
mem[i] = 0;
}else{
mem[i] = 1 + calc(helper[i]);
}
}
return mem[i];
}
int main()
{
int n, i, root, a, b;
fin >> n;
for(i = 1; i <= n; i++){
fin >> ki[i];
}
for(i = 1; i < n; i++){
fin >> a >> b;
graf[a].push_back(b);
is_root[b] = 1;
}
i = 1;
while(is_root[i] == 1){
i++;
}
root = i;
ind = 1;
not_stiva[ind] = root;
DFS(root);
for(i = 1; i <= n; i++){
mem[i] = -1;
}
for(i = 1; i <= n; i++){
fout << calc(i) << " ";
}
fout << "\n";
return 0;
}