Cod sursa(job #190682)

Utilizator hadesgamesTache Alexandru hadesgames Data 23 mai 2008 20:05:57
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <vector>
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
#define pb push_back
#define p push
#define fori(c,it) for(vector<int>::iterator it = (c).begin(); it != (c).end(); it++) 
queue<int> coada;
vector<vector<int> > a(250005),b(250005);
int put[250005],stra[250005],log[35];
char s[250000*7+3];
int nr;
int main()
{
	FILE *in,*out;
	int i,n,m,j,x,y;
	in=fopen("stramosi.in","r");
	out=fopen("stramosi.out","w");
	fscanf(in,"%d%d\n",&n,&m);
	fgets(s+1,250000 *7+3,in);
	i=1;
	nr=0;
	x=0;
	y=strlen(s+1);
	while (i<=y)
	{
		if (s[i]>='0'&&s[i]<='9')
		{
			x=x*10+s[i]-'0';
		}
		else
			if (s[i-1]>='0'&&s[i-1]<='9')
			{
				nr++;
				stra[nr]=x;
				if(!stra[nr])

					coada.p(nr);
				else
					b[stra[nr]].pb(nr);

				x=0;
			}
		++i;
	}
/*	for (i=1;i<=n;i++)
	{
		fscanf(in,"%d",&stra[i]);
		if(!stra[i])
			coada.p(i);
		else
			b[stra[i]].pb(i);
	}
	while (!coada.empty())
	{
		printf("%d ",coada.front());
		coada.pop();
	}*/
	put[1]=0;
	x=2;
	y=1;
	for (i=2;i<=n;++i)
	{
		if (i==x)
		{
			x*=2;
			++y;
		}
		put[i]=y-1;
	
	}
	log[0]=1;
	for (i=1;i<=put[n];++i)
		log[i]=2*log[i-1];
	while (!coada.empty())
	{
		x=coada.front();
	//	printf("%d\n",x);
		coada.pop();
		for(vector<int>::iterator it=b[x].begin();it!=b[x].end();++it)
		{
			coada.p(*it);
			a[*it].pb(x);
			for (j=1;a[a[*it][j-1]].size()>j-1;++j)
			{
				a[*it].pb(a[a[*it][j-1]][j-1]);
			}
			
		}
		
	}
	for (i=1;i<=m;++i)
	{
		fscanf(in,"%d%d",&y,&x);
		while (x)
		{
			if (put[x]>=a[y].size())
			{
				fprintf(out,"0\n");
				break;
			}
			y=a[y][put[x]];
			x-=log[put[x]];
		}
		if (!x)
			fprintf(out,"%d\n",y);
	}
	fclose(in);
	fclose(out);
	return 0;
}