Cod sursa(job #157044)

Utilizator AlxCojocaru Alexandru Alx Data 12 martie 2008 20:40:33
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
#include <math.h>
double doi=2;
int lg[300001];
using namespace std;
int main()
{
 int (*a)[300001],*nrs,n,m,p,q,i;
 double j;
 freopen ("stramosi.in","r",stdin);
 freopen ("stramosi.out","w",stdout);
 scanf ("%d %d",&n,&m);
 nrs=new int[300001];
 a=new int[18][300001];
 a[0][0]=0;
 for (i=1;i<=n;i++)
 {
  scanf ("%d",&a[0][i]);
  nrs[i]=1;
  if (i<18)
   a[i][0]=0;
 }
 for (i=1;i<=n;i++)
  for (j=1;j<18;j++)
  {
   int y=j;
   a[y][i]=a[y-1][a[y-1][i]];
  }
 lg[1]=0;
 for (i=2;i<=300000;i++)
  lg[i]=lg[i/2]+1;
 for (i=0;i<m;i++)
 {
  scanf("%d %d",&q,&p);
  //j=0;
  //while (pow(doi,j)<p)
   //j++;
  while ((1<<lg[p])!=p)
  {
   p-=(1<<(lg[p]-1));
   int y=lg[p]-1;
   q=a[y][q];
   //j=0;
   //while (pow(doi,j)<p)
    //j++;
  }
  int y=j;
  printf("%d\n",a[y][q]);
 }
 return 0;
}