Cod sursa(job #352684)

Utilizator ilincaSorescu Ilinca ilinca Data 3 octombrie 2009 01:43:14
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>

#define nmax 100005

int n, k [nmax], s [nmax], a [21] [nmax];


void scan ()
{
	int i, A, B;
	scanf ("%d", &n);
	for (i=1; i <= n; ++i)
	       scanf ("%d", &k [i]);
	for (i=1; i < n; ++i) 
	{
		scanf ("%d%d", &A, &B);
		a [0] [B]=A;
	}	
}

void preg ()
{
	int i, j;
	for (i=1; i <= 19; ++i)
	       for (j=1; j <= n; ++j)
	       		a [i] [j]=a [i-1] [a [i-1] [j]];	       
}

void init ()
{
	for (int i=1; i <= n; ++i) 
		s [i]=-1;
}

int rez (int x)
{
	int p=x, q=k [x], u, i;
	if (s [p] != -1)
	       return s [p];
	if (k [p] == 0)
	{
		s [p]=0;
		return s [p];	
	}
	for (i=0, u=1; i <= 19; ++i, u <<= 1) 
		if (q & u) 
			p=a [i] [p];
	s [x]=1+rez (p);
	return s [x];	
}

void print ()
{
	int i;
	for (i=1; i <= n; ++i) 
		printf ("%d ", s [i]);
	printf ("\n");
}

int main ()
{
	freopen ("cerere.in", "r", stdin);
	freopen ("cerere.out", "w", stdout);
	scan ();
	preg ();
	init ();
	for (int i=1; i <= n; ++i)
	       if (s [i] == -1) 	
			s [i]=rez (i);
	print ();
	return 0;
}