Cod sursa(job #352798)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 3 octombrie 2009 14:32:37
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <stdio.h>
#define N 1<<17
#define Q 1<<5
int n,nr[N],sol[N],parinte[Q][N];
char viz[N];
void read()
{
	scanf("%d\n",&n);
	int i,x,y;
	for (i=1; i<=n; i++)
		scanf("%d",&nr[i]);
	for (i=1; i<n; i++)
	{
		scanf("%d%d",&x,&y);
		parinte[0][y]=x;
	}
}
void precalculate()
{
	int i,j;
	for (i=1; (1<<i)<=n; i++)
		for (j=1; j<=n; j++)
			parinte[i][j]=parinte[i-1][parinte[i-1][j]];
}
int stramos(int nod,int q)
{
	int i=0;
	while (q)
	{
		if (q%2)
			nod=parinte[i][nod];
		q/=2;
		i++;
	}
	return nod;
}
void solve(int nod)
{
	viz[nod]=1;
	int t=nod;
	t=stramos(nod,nr[nod]);
	if (!viz[t])
	{
		solve(t);
		sol[nod]=sol[t]+1;
	}
	else
		sol[nod]=sol[t]+1;
}
int main()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	read();
	precalculate();
	for (int i=1; i<=n; i++)
	{
		if (!viz[i])
			solve(i);
		printf("%d ",sol[i]-1);
	}
	return 0;
}