Pagini recente » Cod sursa (job #1730929) | Cod sursa (job #1963349) | Cod sursa (job #2198045) | Cod sursa (job #2077403) | Cod sursa (job #1746639)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define MAXN 100050
using namespace std;
int n;
int k[MAXN], sol[MAXN], parent[MAXN];
vector<int> graf[MAXN];
void citire()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &k[i]);
for (int i = 1; i <= n-1; i++) {
int x, y;
scanf("%d %d", &x, &y);
graf[x].push_back(y);
graf[y].push_back(x);
}
}
int stiva[MAXN];
void solve()
{
int dr = 0;
stiva[++dr] = 1;
int c = 0;
while (dr) {
c++;
int nod = stiva[dr];
if (k[nod] == 0)
sol[nod] = 0;
else {
sol[nod] = sol[stiva[dr-k[nod]]] + 1;
}
if (graf[nod].empty())
dr--;
else {
if (graf[nod].back() != parent[nod]) {
stiva[++dr] = graf[nod].back();
parent[graf[nod].back()] = nod;
}
graf[nod].pop_back();
}
}
}
int main()
{
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
citire();
solve();
for (int i = 1; i <= n; i++)
printf("%d ", sol[i]);
return 0;
}