Pagini recente » Cod sursa (job #1826132) | Cod sursa (job #1420213) | Cod sursa (job #3211607) | Cod sursa (job #145264) | Cod sursa (job #341998)
Cod sursa(job #341998)
#include<cstdio>
#define N 100001
int n,num,d[N],x[N],y[N],st[N],u,*a[N];
bool b[N];
struct cerere{int t,c;}v[N];
void completez(int x)
{
if (!v[x].t)
v[x].c=0;
else
{
int cx=x,num=0,cu=u;
while (v[cx].t)
{
int g=v[cx].t;
cu=cu-g+1;
cx=st[cu];
++num;
--cu;
}
v[x].c=num;
}
}
void dfs(int x)
{
for (int i=1; i<=a[x][0]; ++i)
{
if (a[a[x][i]][0])
{
completez(a[x][i]);
st[++u]=a[x][i];
dfs(st[u]);
--u;
}
else
{
completez(a[x][i]);
}
}
}
void citire()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
for (int i=1; i<=n; ++i)
scanf("%d",&v[i].t);
for (int i=1; i<n; ++i)
{
scanf("%d%d",&x[i],&y[i]);
++d[x[i]];
b[y[i]]=true;
}
for (int i=1; i<=n; ++i)
{
a[i]=new int [1+d[i]];
a[i][0]=0;
}
for (int i=1; i<n; ++i)
a[x[i]][++a[x[i]][0]]=y[i];
for (int i=1; i<=n; ++i)
if (!b[i])
{
st[++u]=i;
dfs(i);
return;
}
}
void afis()
{
for (int i=1; i<=n; ++i)
{
/*printf("%d ",i);
for (int j=1; j<=a[i][0]; ++j)
printf("%d ",a[i][j]);
printf("\n");*/
printf("%d ",v[i].c);
}
}
int main()
{
citire();
afis();
return 0;
}