Pagini recente » Cod sursa (job #897433) | Cod sursa (job #3151305) | Cod sursa (job #2389979) | Cod sursa (job #3260918) | Cod sursa (job #963374)
Cod sursa(job #963374)
#include <cstdio>
#include <vector>
using namespace std;
const int MAX_N = 100100;
vector<int> G[MAX_N];
int n;
int k[MAX_N];
int at[MAX_N];
int st[MAX_N];
int care[MAX_N];
int TT[MAX_N];
void dfs(int nod,int lvl)
{
while(lvl >= 1){
st[lvl] = nod;
if(k[nod] == 0)
care[nod] = 0;
else{
register int aux = lvl - k[nod];
care[nod] = 1 + care[st[aux]];
}
if(at[nod] < G[nod].size()){
nod = G[nod][at[nod]++];
lvl++;
}else{
nod = TT[nod];
lvl--;
}
}
}
int main()
{
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
int i;
scanf("%d",&n);
for(i = 1 ; i <= n ; ++ i)
scanf("%d",k+i);
int x,y;
for(i = 1 ; i < n ; ++ i){
scanf("%d%d",&x,&y);
G[x].push_back(y);
TT[y] = x;
}
for(i = 1 ; i <= n ; ++ i)
if(TT[i] == 0)
break;
dfs(i,1);
for(i = 1 ; i <= n ; ++ i)
printf("%d ",care[i]);
return 0;
}