Pagini recente » Cod sursa (job #1598344) | Cod sursa (job #2377394) | Cod sursa (job #1704167) | Cod sursa (job #410223) | Cod sursa (job #305449)
Cod sursa(job #305449)
#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;}