Cod sursa(job #323953)

Utilizator pcinfoCarmen Popescu pcinfo Data 14 iunie 2009 11:32:13
Problema Stramosi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<cstdio> 
#include <vector>

using namespace std;

struct nod {
	int gr;
	vector<int> fii;
};

vector<int> viz, s;
vector<nod> arb;
vector< vector<int> > p(250003);
int exp[19]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144};

void df(int vf)
{
	int i,j,k;
	s[1]=vf; 
	 
	vf=1;
	
	while (vf>0)
	{
		i=s[vf];
		
		j=0;
		if (arb[i].fii.size()>0)
		{
			j=arb[i].fii.back();
			arb[i].fii.pop_back();
		}
			
		if (j>0)
		{
			viz[j]=1;
			vf++;
			s[vf]=j;
			for (k=1;k<19;k++)
				if (vf-exp[k]>0)
					p[j][k]=s[vf-exp[k]];
				else
					p[j][k]=0;
		}
		else
			vf--;
	}
}

int main()
{
	int n,vf,i,j,m,k;
	
	freopen("stramosi.in","r",stdin);   
	freopen("stramosi.out","w",stdout);   
	
	scanf("%d %d",&n,&m);
	
	viz.reserve(n+1);
	s.reserve(n+1);
	arb.reserve(n+1);	
	p[0].reserve(19);
	
	for (i=0;i<=n;i++)
	{
		p[i].reserve(19);
		for (j=0;j<19;j++)
			p[i][j]=0;
	}
	
	for (i=1;i<=n;i++)
	{
		scanf("%d",&j);
		arb[i].gr=0;
		if (j>0)
		{
			arb[j].fii.push_back(i);
			arb[i].gr=1;
			p[i][0]=j;
		}
	}
	
		
	vf=0;
	for (i=1;i<=n;i++)
		if (arb[i].gr==0)
		{
			vf=i;
			df(i);
		}
	
	
	while (m>0)
	{
		m--;
		scanf("%d%d",&j,&i);
		k=0;
		if (i==0)
			j=p[j][0];
		else
		{
			while (i>0)
			{
				while (exp[k]<=i)
					k++;
				k--;
				i=i-exp[k];
				j=p[j][k];
			}
		}
		printf("%d\n",j);
	}
	
	return 0;
}