Cod sursa(job #305449)

Utilizator ConsstantinTabacu Raul Consstantin Data 17 aprilie 2009 14:13:35
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#include<alloc.h>
#include<string.h>

struct nod{int a;nod *urm;} *v[250010],*p;

int lg[25010],*x[250010],i,a[250010],j,k,l,m,n;
char viz[250010];

void dfs1(int n,int lvl){
//memcpy(x[i],lg+1,(lvl*(sizeof(lg[0]))));
lg[n]=lvl;

nod *p;
for(p=v[n];p;p=p->urm)
	
	dfs1(p->a,lvl+1);
	


}void dfs2(int n,int lvl){

//lg[n]=lvl;

nod *p;
for(p=v[n];p;p=p->urm)
	{a[lvl]=p->a;
	dfs2(p->a,lvl+1);
	a[lvl]=0;
	}
	
if(lvl>1)
memcpy(x[n],a,((lvl-1)*(sizeof(a[0]))));
}


int main(){
FILE *f=fopen("stramosi.in","r");
freopen("stramosi.out","w",stdout);

fscanf(f,"%d %d",&n,&m);

for(i=1;i<=n;i++)
	{fscanf(f,"%d",&k);
	if(k){
	viz[i]=1;
		p=new nod;
		p->a=i;
		p->urm=v[k];
		v[k]=p;	
		}
	}
for(i=1;i<=n;i++)
	if(!viz[i])
		dfs1(i,0);
	
for(i=1;i<=n;i++)
	if(lg[i])
	x[i]=(int *)malloc(lg[i]);
//memset(lg,0,sizeof(lg));
for(i=1;i<=n;i++)
	if(!viz[i]){
	a[0]=i;
		dfs2(i,1);}
	

for(i=1;i<=m;i++)
	{fscanf(f,"%d %d",&k,&l);

	if(l<=lg[k])
	printf("%d\n",x[k][lg[k]-l]);
	else
		printf("%d\n",0);
	}
return 0;}