Pagini recente » Cod sursa (job #946580) | Cod sursa (job #1961623) | Cod sursa (job #542566) | Cod sursa (job #2641264) | Cod sursa (job #352150)
Cod sursa(job #352150)
#include <cstdio>
#include <algorithm>
using namespace std;
template < int N >
class TLog { public: enum { value = 1 + TLog < N / 2 > :: value } ; } ;
template < >
class TLog < 1 > { public : enum { value = 0 } ; } ;
int const
maxn = 100 * 1000
,maxp = 1 + TLog < maxn > :: value;
int
K[1+maxn]
,P[1+maxn]
,N
,A[maxp][1+maxn]
,G[1+maxn]
,L[2+maxn]
,I[2+maxn]
,C[2+maxn]
,Q[2+maxn];
int
climb ( int v, int t ) {
int i=1,j,z=0;
while (t>0) {
j=2*i;
if (j<t) { i=j; ++z; }
else { t-=i; v=A[z][v]; z=0; }
}
return v;
}
int
main ( ) {
freopen("cerere.in", "r", stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&N);
int i,a,b,j;
for ( i=1; N>=i; ++i ) { scanf ("%d", &K[i] ); }
for ( i=1; N>=i; ++i ) { P[i]=0; }
for ( i=1; N-1>=i; ++i ) { scanf("%d %d",&a,&b); P[b]=a; }
for ( i=1; N>=i; ++i ) { A[0][i]=P[i]; }
for ( j=0; maxp>j; ++j ) { A[j][0]=0; }
for ( j=1; maxp>j; ++j ) {
for ( i=1; maxn>=i; ++i ) {
A[j][i]=A[j-1][A[j-1][i]];
}
}
for ( i=1; N>=i; ++i ) { C[i]=0; }
for ( i=1; N>=i; ++i ) { ++ C[P[i]]; }
I[0]=0; for ( i=1; N+1>=i; ++i ) { I[i]=I[i-1]+C[i-1]; }
for ( i=1; N>=i; ++i ) { j=P[i]; L[I[j]]=i; ++I[j]; }
I[0]=0; for ( i=1; N+1>=i; ++i ) { I[i]=I[i-1]+C[i-1]; }
i=1; while ( 0 != P[i] ) { ++i; }
int qi, qo;
qi=1; qo=0; Q[0]=i;
while ( qo<qi ) {
i=Q[qo]; ++qo;
for ( j=I[i]; j<I[i+1]; ++j ) { Q[qi]=L[j]; ++qi; }
}
for ( i=0; N>i; ++i ) {
j=Q[i];
if ( 0 == K[j] ) { G[j]=0; }
else { G[j] = 1 + G[climb ( j, K[j] )]; }
}
printf ( "%d", G[1]);
for ( i=2; N>=i; ++i ) { printf ( " %d", G[i]); }
printf ( "\n" ) ;
return 0;
}