Cod sursa(job #131684)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 4 februarie 2008 12:52:08
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
 #include <stdio.h>  
 #include <fstream>  
 using namespace std;  
   
 #define in "stramosi.in"  
 #define out "stramosi.out"  
 #define dim 250001  
   
 int N, M;  
 int A[20][dim]; // A[i][j] - al 2^i-lea stramos a lui j  
 int K;  
   
 int Search(int,int);  
   
 int main()  
 {  
     int X, Y;  
     freopen(in,"r",stdin);  
     freopen(out,"w",stdout);  
       
     scanf("%d%d", &N, &M);  
       
     for ( int i = 1; i <= N; i++ )  
     {  
           scanf("%d", &X);  
           A[0][i] = X;  
     }  
       
     for ( int i = 1; i < 19; i++ )  
         for ( int j = 1; j <= N; j++ )  
             A[i][j] = A[i-1][ A[i-1][j] ];  
       
     for ( ; M; M-- )  
     {  
         scanf("%d%d", &X, &Y);  
         printf("%d\n", Search(X,Y) );  
     }  
 }  
   
 int Search(int X, int Y)  
 {  
      K = 18;  
      while ( (1<<K) > Y ) --K;  
        
      Y -= (1<<K);  
        
      if ( !Y ) return A[K][X];  
      return    Search( A[K][X], Y );  
 }