Cod sursa(job #281581)

Utilizator alisssiaMititelu Andra alisssia Data 15 martie 2009 13:39:55
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
using namespace std;
#define Nmax 300000
#include<cstdio>
struct nod { int v; nod* next;};
struct bla {int cati,poz; bla *urm;};
bla *q[Nmax];
nod * a[Nmax];
int n,m,viz[Nmax],sol[Nmax],stiva[Nmax];

void add(int i,int j)
{
	nod *p=new nod;
	p->v=i;
	p->next=a[j];
	a[j]=p;
}

void add2(int i,int j,int k)
{
	bla*p=new bla;
	p->cati=j;
	p->poz=k;
	p->urm=q[i];
	q[i]=p;
}

void read()
{
	int i,j,k;
	freopen("stramosi.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		{
			scanf("%d",&j);
			add(i,j);
		}
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&j,&k);
		add2(j,k,i);
	}
}




void dfs(int i,int j)
{
	stiva[i]=j;
	for(bla *p=q[j];p;p=p->urm)
		if(i-p->cati>=0)
			sol[p->poz]=stiva[i-p->cati];
		else sol[p->poz]=0;
		
	viz[j]=1;
	for(nod*u=a[j];u;u=u->next)
		if(!viz[u->v]) 
			{
				
				dfs(i+1,u->v);
		}
}

int main()
{
	int i;
	read();
	for(i=1;i<=n;i++)
	if(!viz[i]) dfs(0,i);
	freopen("stramosi.out","w",stdout);
	for(i=1;i<=m;i++)
		printf("%d\n",sol[i]);
	return 0;
}