Cod sursa(job #780607)

Utilizator stef1995mmarcu stefan ovidiu stef1995m Data 20 august 2012 21:09:41
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<cstdio>
#include<vector>
const int maxx1=250005,maxx2=300005;
using namespace std;
int stiva[maxx1],n,m,i,a,b,nr,ans[maxx2],q[maxx2],tata[maxx1],copie[maxx1];
vector <int> quest[maxx1],x[maxx1];
void eval(int cnod)
{
	for(int i=0;i<quest[cnod].size();i++)
			if(q[quest[cnod][i]]>=nr)
				ans[quest[cnod][i]]=0;
			else
				ans[quest[cnod][i]]=stiva[nr-q[quest[cnod][i]]];
}
void df(int nod)
{
	stiva[++nr]=nod;
	int i=0,t,cnod;
	while(nr>0)
	{
		t=0;
		for(;i<x[nod].size();i++)
			if(tata[nod]!=x[nod][i])
			{
				stiva[++nr]=x[nod][i];
				cnod=nod;
				nod=x[nod][i];
				copie[nr]=i+1;
				i=x[nod].size()+5;
				t=1;
			}
		
		if(t==0)
		{
			i=copie[nr];
			eval(nod);
			nr--;
			nod=stiva[nr];
		}
		else
		{
			i=0;
			eval(cnod);
		}
	}
}
int main()
{
	freopen("stramosi.in","r",stdin);
	freopen("stramosi.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&tata[i]);
		x[tata[i]].push_back(i);
		x[i].push_back(tata[i]);
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d %d",&a,&b);
		quest[a].push_back(i);
		q[i]=b;
	}
	for(i=1;i<=n;i++)
		if(tata[i]==0)
			df(i);
	for(i=1;i<=m;i++)
		printf("%d\n",ans[i]);
	return 0;
}