Pagini recente » Cod sursa (job #2552031) | Cod sursa (job #2756086) | Cod sursa (job #965617) | Cod sursa (job #957937) | Cod sursa (job #198142)
Cod sursa(job #198142)
#include <cstdio>
#include <vector>
#define IN "cerere.in"
#define OUT "cerere.out"
#define pb push_back
#define vv vector
#define N_MAX 100001
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
vv < vv<int> > a(N_MAX);
vv <int> ks(N_MAX);
vv <bool> viz(N_MAX);
vv <bool> rad(N_MAX);
vv <int> stv(N_MAX);
vv <int> sol(N_MAX);
int niv,N;
void scan()
{
int x,y;
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d\n", &N);
FOR(i,1,N)
scanf("%d", &ks[i]);
FOR(i,2,N)
scanf("%d %d\n",&x,&y),
a[x].pb(y),
rad[y] = 1;
}
void df(int nod)
{
viz[nod] = true;
stv[++niv] = nod;
if(!ks[nod])
sol[nod] = 0;
else
sol[nod] = sol[ stv[niv - ks[nod]]] + 1;
int l=a[nod].size();
for(int i=0;i<l;++i)
if(!viz[ a[nod][i] ])
df( a[nod][i] );
--niv;
}
void solve()
{
int root;
FOR(i,1,N)
if(!rad[i])
{ root = i;
break; }
df(root);
}
void print()
{
FOR(i,1,N-1)
printf("%d ",sol[i]);
printf("%d\n",sol[N]);
}
int main()
{
scan();
solve();
print();
return 0;
}