Cod sursa(job #53523)

Utilizator chermanCorina Herman cherman Data 22 aprilie 2007 14:04:48
Problema Stramosi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 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 cauta(int nr, int times)
{
    nr = a[0][nr-1];

  //cout <<nr<< endl;
      int t=log2(times);
    while (a[t][nr-1]==-1) t--;

 	for ( int i = pow(2,t)+1;i<= times; i++ )
	{
	    int lg=(int)log2(i);

		if (i&(i-1)==0)//( lg==pow(2,i))
		{
		    if (a[lg][nr-1]==0) return 0;
		    else a[lg][nr-1]=nr;
		}
		nr = a[0][nr-1];
	}

  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));
     }



	return 0;
}