Cod sursa(job #129102)

Utilizator tErMyAndrei Panturu tErMy Data 28 ianuarie 2008 17:29:01
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
 #include <stdio.h>  
 #include <string.h>  
 #define NMAX 250005  
 #define LOGMAX 19  
 #define FIN "stramosi.in"  
 #define FOUT "stramosi.out"  
   
 int A[LOGMAX][NMAX];  
 int N, M, i, j, p, q;  
 FILE * fin, * fout;  
   
 void build()  
 {  
     int i, j;  
     for( i = 1; i < LOGMAX; i++)  
         for( j = 1; j <= N; j++) A[i][j] = A[ i-1][A[i-1][j]];  
 }  
 int query( int nod, int niv )  
 {  
     int step = 0;  
     while ( 1 << step < niv ) step ++;  
     while ( niv && nod )  
     {  
         while ( 1 << step > niv ) step--;  
         nod = A[step][nod];  
         niv -= 1 << step;  
     }  
     return nod;  
 }  
 int main()  
 {  
     fin = fopen( FIN, "r" );  
     fout = fopen( FOUT, "w" );  
     fscanf( fin, "%d %d\n", &N, &M );  
     memset( A, 0, sizeof(A));  
     for( i = 1; i <= N; i++ ) fscanf( fin , "%d", &A[0][i] );  
     build();  
     while (M)  
     {  
         fscanf( fin, "%d %d\n", &p, &q );  
         fprintf( fout, "%d\n", query( p, q ) );  
         M--;  
     }  
   
     return 0;  
     fclose( fin );  
     fclose( fout );  
 }