Cod sursa(job #4532)

Utilizator sealTudose Vlad seal Data 5 ianuarie 2007 12:11:01
Problema Stramosi Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 0.7 kb
#include<stdio.h>
#include<stdlib.h>
#define Nm 250001
int a[18][Nm],*g[Nm],d[Nm],s[Nm],k[Nm];

void DF(int x)
{ int i,t;
  s[t=1]=x;
  while(t)
    if(k[s[t]]<d[s[t]])
    { s[++t]=g[s[t-1]][k[s[t-1]]++];
      for(i=0;1<<i<t;i++) a[i][s[t]]=s[t-(1<<i)]; }
    else t--; }

int main(void)
{ int n,m,i,j,x,y;
  freopen("stramosi.in","r",stdin);
  freopen("stramosi.out","w",stdout);
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)
  { scanf("%d",&j);
    g[j]=(int*)realloc(g[j],(d[j]+1)*sizeof(int));
    g[j][d[j]++]=i; }
  for(i=0;i<d[0];i++) DF(g[0][i]);
  for(i=0;i<m;i++)
  { scanf("%d%d",&x,&y);
    for(j=0;1<<j<=y;j++)
      if(1<<j&y) x=a[j][x];
    printf("%d\n",x); }
  return 0; }