Cod sursa(job #54624)

Utilizator chermanCorina Herman cherman Data 25 aprilie 2007 11:38:30
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <iostream>
#include <math.h>

using namespace std;


#define NMAX 250001

int a[20][NMAX];

FILE *in = fopen("stramosi.in", "r"), *out = fopen("stramosi.out", "w");
int n, m;
/*
inline int findvlad(int nr, int times)
{
    nr = N[nr-1];
 	for ( int i = times-1; i != 0; i-- )
	{
		if ( N[nr-1] == 0 )
			return 0;
		nr = N[nr-1];
	}

  return nr;
}
inline int cautarec(int nr, int times)
{
  if (times>1)
    nr=cautarec(a[0][nr-1],times-1);
  else
   nr=a[0][nr-1];

  return nr;
}
*/
inline int cauta(int nr, int times)
{
    nr = a[0][nr-1];

    int tt=log2(times);
    while (a[tt][nr-1]==-1) tt--;

    int j=2<<tt;//pow(2,tt)+1;
 	for ( int i = j;i<=times; i++ )
	{
        int t=a[0][nr-1];
		if ( t == 0 ) return 0;

	    if (i&(i-1)==0)
	    {
         int lg;
	     if(a[lg=(int)log2(i)][t]!=-1)
	       return a[lg][t];
         a[lg][nr-1]=t;
		}
		nr = t;

	}

  return nr;
}


int main ()
{
	int temp1, temp2;

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

	for ( int i = 0; i != n; ++i )
	{
		fscanf(in, "%d", &a[0][i]);
		 for ( int j = 1; j<20; ++j )
            a[j][i] = -1;
	}



	for ( int i = m-1; i != -1; --i )
	{

	    fscanf(in, "%d %d", &temp1, &temp2);
	    fprintf(out, "%d\n", cauta(temp1, temp2));
	    //fprintf(out, "%d\n", cautarec(temp1, temp2));
     }

   /*
   for (int t=0;t<10;t++)
     printf("%d\n",(2<<(t-1))+1);
     */
	return 0;
}