Cod sursa(job #197083)

Utilizator AndreyPAndrei Poenaru AndreyP Data 1 iulie 2008 12:55:13
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<stdio.h>
#define N 100005
int n,k[N],g[N];
int a[N][21];
int loga[21]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144};
char c[700010];
void parsare()
{
	int i,aux=0,cat=0;
	fgets(c,700010,stdin);
	for(i=0; c[i]!='\0'; i++)
	{
		if((c[i]>='0')&&(c[i]<='9'))
			aux=aux*10+c[i]-'0';
		else
		{
			k[++cat]=aux;
			aux=0;
		}
	}
}
void citire()
{
	int i,x,y,j;
	scanf("%d\n",&n);
	/*for(i=1; i<=n; i++)
		scanf("%d",&k[i]);*/
	parsare();
	for(i=1; i<n; i++)
	{
		//scanf("%d%d",&x,&y);
		fgets(c,700010,stdin);
		x=y=0;
		for(j=0; (c[j]>='0')&&(c[j]<='9'); j++)
			x=x*10+c[j]-'0';
		j++;
		for(; (c[j]>='0')&&(c[j]<='9'); j++)
			y=y*10+c[j]-'0';
		a[y][0]=x;
		a[y][20]=1;
	}
}
void precalc()
{
	int i,cat=-1;
	bool ok=true;
	while(ok)
	{
		cat++;
		ok=false;
		for(i=1; i<=n; i++)
		{
			if(a[i][20]>cat)
			{
				if(a[a[i][cat]][20]>cat)
				{
					ok=true;
					a[i][cat+1]=a[a[i][cat]][cat];
					a[i][20]++;
				}
			}
		}
	}
}
int caut(int x)
{
	int p=0,u=18,m;
	while(p<u)
	{
		m=(p+u)>>1;
		if(x<=loga[m])
			u=m;
		else
			p=m+1;
	}
	if(loga[p]>x)
		p--;
	return p;
}
int afla(int care)
{
	int acu=k[care],str=care,aux;
	while(acu)
	{
		aux=caut(acu);
		str=a[str][aux];
		acu-=loga[aux];
	}
	return str;
}
void rezolva (int care)
{
	int cati=0;
	while(k[care])
	{
		cati++;
		care=afla(care);
	}
	printf("%d ",cati);
}
int main()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	citire();
	precalc();
	int i;
	for(i=1; i<=n; i++)
		rezolva(i);
	printf("\n");
	return 0;
}