Pagini recente » Cod sursa (job #1536521) | Cod sursa (job #2515524) | Cod sursa (job #1539647) | Cod sursa (job #2174720) | Cod sursa (job #1144636)
#include <stdio.h>
using namespace std;
const long nmax=100005;
long n,xx,yy,x[nmax],s[nmax],a[18][nmax],i,j,nr;
FILE *f,*g;
void read()
{
fscanf(f,"%d",&n);
for (i=1;i<=n;i++) fscanf(f,"%d",&s[i]);
for (i=1;i<n;i++)
{
fscanf(f,"%d%d",&xx,&yy);
x[yy]=xx;
}
}
void ancestors()
{
for (j=1;j<=n;j++) a[0][j]=x[j];
for (i=1;i<=17;i++)
for (j=1;j<=n;j++)
a[i][j]=a[i-1][a[i-1][j]];
}
long lookforancestor(int nod,int p)
{
int k;
for (k=17;k>=0;k--)
if (p&(1<<k)) nod=a[k][nod];
return nod;
}
void solve()
{
int q;
for (i=1;i<=n;i++)
{
q=i;
nr=0;
while (s[q]!=0)
{
nr++;
q=lookforancestor(q,s[q]);
}
fprintf(g,"%d",nr);
fprintf(g," ");
}
}
int main()
{
f=fopen("cerere.in","r");
g=fopen("cerere.out","w");
read();
ancestors();
solve();
fclose(f);fclose(g);
return 0;
}