Cod sursa(job #190719)

Utilizator AndreyPAndrei Poenaru AndreyP Data 23 mai 2008 23:26:39
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>
int n,m,k,acu,p,q;
const int doi[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576};
int a[20][250010],lc;
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 dfs()
{
	if(q==0)
		return;
	if(k==doi[lc])
	{
		a[lc][acu]=q;
		lc++;
	}
	q=a[0][q];
	k++;
	dfs();
}
int caut(int r)
{
	int p1=0,q1=20,m;
	while(p1<q1)
	{
		m=(p1+q1)>>1;
		if(doi[m]>=r)
			q1=m;
		else
			p1=m+1;
	}
	if(doi[p1]>r)
		p1--;
	return p1;
}
/*void dfs1()
{
	if((p==k)||(q==0))
	{
		printf("%d\n",q);
		return;
	}
	q=a[0][q];
	k++;
	dfs1();
}*/
int main()
{
	freopen("stramosi.in","r",stdin);
	freopen("stramosi.out","w",stdout);
	scanf("%d%d\n",&n,&m);
	int i,r,p1;
	citire();
	for(i=1; i<=n; i++)
	{
		q=a[0][i];
		acu=i;
		lc=1;
		k=1;
		dfs();
	}
	/*int j;
	for(i=0; i<=10; i++)
	{
		for(j=1; j<=n; j++)
			printf("%2d ",a[i][j]);
		printf("\n");
	}*/
	for(i=0; i<m; i++)
	{
		citeste();
		p1=p;
		k=0;
		while((k!=p)&&(q))
		{
			r=caut(p1);
			k+=doi[r];
			q=a[r][q];
			p1=p-k;
		}
		printf("%d\n",q);
		//dfs1();
	}
	return 0;
}