Cod sursa(job #352150)

Utilizator mgntMarius B mgnt Data 30 septembrie 2009 15:39:13
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#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;
}