Pagini recente » Concursuri organizate de infoarena | Cod sursa (job #515974) | Cod sursa (job #1031748) | Cod sursa (job #3162392) | Cod sursa (job #323879)
Cod sursa(job #323879)
#include<cstdio>
#include <vector>
using namespace std;
int main()
{
int n,vf,i,j;
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
vector<int> viz(n+1,0), urm(n+1,0), p(n+1,0), s(n+1,0), k(n+1,0), tata(n+1,0);
for (i=1;i<=n;i++)
scanf("%d", &k[i]);
for (i=0;i<n-1;i++)
{
scanf("%d %d",&j,&vf);
tata[vf]=j;
}
vf=0;
for (i=1;i<=n;i++)
if (tata[i]==0)
{
vf=i;
break;
}
s[1]=vf; urm[1]=0;
p[vf]=0;
vf=1;
while (vf>0)
{
i=s[vf];
j=urm[i]+1;
while (tata[j]!=i && j<=n)
j++;
if (j>n)
vf--;
else
{
urm[i]=j;
if (viz[j]==0)
{
viz[j]=1;
vf++;
s[vf]=j;
urm[j]=0;
if (k[j]==0)
p[j]=0;
else
p[j]=p[s[vf-k[j]]]+1;
}
}
}
for (i=1;i<=n;i++)
printf("%d ",p[i]);
return 0;
}