Pagini recente » Monitorul de evaluare | Cod sursa (job #2000760) | Cod sursa (job #1528972) | Statistici Gavrila Diana (dianagavrila) | Cod sursa (job #1746634)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define MAXN 100050
using namespace std;
int n;
int k[MAXN], sol[MAXN];
vector<int> graf[MAXN];
queue<int> arb[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);
}
}
void agat(int parent, int nod)
{
for (int i = 0; i < graf[nod].size(); i++) {
if (graf[nod][i] != parent) {
arb[nod].push(graf[nod][i]);
agat(nod, graf[nod][i]);
}
}
}
int stiva[MAXN];
void solve()
{
int dr = 0;
stiva[++dr] = 1;
while (dr) {
int nod = stiva[dr];
if (k[nod] == 0)
sol[nod] = 0;
else {
sol[nod] = sol[stiva[dr-k[nod]]] + 1;
}
if (arb[nod].empty())
dr--;
else {
stiva[++dr] = arb[nod].front();
arb[nod].pop();
}
}
}
int main()
{
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
citire();
agat(-1, 1);
solve();
for (int i = 1; i <= n; i++)
printf("%d ", sol[i]);
return 0;
}