Cod sursa(job #190741)

Utilizator AndreyPAndrei Poenaru AndreyP Data 23 mai 2008 23:53:23
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<stdio.h>
int n,m,p,q;
int doi[250010];
int a[20][250010],log[20];
char c[1750010];
void citire()
{
	fgets(c,1750010,stdin);
	int i,aux=0,n1=0,aux1,aux2;
	for(i=0; c[i]!='\0'; i++)
	{
		if(c[i]>='0')
		{
			aux1=aux<<3;
			aux2=aux<<1;
			aux=aux1+aux2+c[i]-'0';
		}
		else
		{
			a[0][++n1]=aux;
			aux=0;
		}
	}
}
void citeste()
{
	fgets(c,100,stdin);
	p=q=0;
	int i,j,q1,q2;
	for(i=0; c[i]>='0'; i++)
	{
		q1=q<<3;
		q2=q<<1;
		q=q1+q2;
		q+=c[i]-'0';
	}
	for(j=i+1; c[j]>='0'; j++)
		p=p*10+c[j]-'0';
}
void precalc()
{
	int x=2,y=0,i;
	doi[1]=0;
	for(i=2; i<=n; i++)
	{
		if(i==x)
		{
			x*=2;
			y++;
		}
		doi[i]=y;
	}
	log[0]=1;
	for(i=1; i<=doi[n]; i++)
		log[i]=2*log[i-1];
}
int main()
{
	freopen("stramosi.in","r",stdin);
	freopen("stramosi.out","w",stdout);
	scanf("%d%d\n",&n,&m);
	int i,j;
	citire();
	precalc();
	for(i=1; i<=doi[n]; i++)
	{
		for(j=1; j<=n; j++)
			a[i][j]=a[i-1][a[i-1][j]];
	}
	for(i=0; i<m; i++)
	{
		citeste();
		while((p)&&(q))
		{
			q=a[doi[p]][q];
			p-=log[doi[p]];
		}
		printf("%d\n",q);
	}
	return 0;
}