Cod sursa(job #566447)

Utilizator petre_mihaiPetrisor Mihai petre_mihai Data 28 martie 2011 23:43:24
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<stdio.h>
#include<stdlib.h>
#define dim 250005
using namespace std;

int *A[dim],n,m,i,x,degr[dim],v[dim*2],nr,F[2*dim],Q,P,pp;

void dfs(int x)
{int i;
	
	v[++nr]=x;
	F[x]=nr;
	for(i=1;i<=A[x][0];i++)
	{
		dfs(A[x][i]);
		if(i+1<=A[x][0])
			v[++nr]=x;
	}
	
	v[++nr]=x;

}



int main()
{
	FILE *f=fopen("stramosi.in","r"), *g=fopen("stramosi.out","w");
	
fscanf(f,"%d %d",&n,&m);

for(i=1;i<=n;i++)
{
A[i]=(int*) realloc(A[i],sizeof(int));
A[i][0]=0;	
}
for(i=1;i<=n;i++)
{
	fscanf(f,"%d ",&x);
	if(x!=0)
	{	A[x][0]++;
		A[x]=(int*) realloc(A[x],(A[x][0]+1) * sizeof(int));
		A[x][A[x][0]]=i;	
		degr[i]++;
	}
}
for(i=1;i<=n;i++)
	if(degr[i]==0)
		dfs(i);
	int ok=1;
for(i=1;i<=m;i++)	
{
	fscanf(f,"%d %d",&Q,&P);

	pp=F[Q];
	
	while(ok)
	{
		if(P==0)
			{fprintf(g,"%d\n",v[pp]); break;}
		if(!degr[v[pp]])
			{fprintf(g,"0\n"); break;}
		else pp=F[v[--pp]];		
		P--;
	}

}

fclose(f);
fclose(g);

return 0;
}