Cod sursa(job #146602)

Utilizator TabaraTabara Mihai Tabara Data 1 martie 2008 22:15:32
Problema Stramosi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>

#define in "stramosi.in"
#define out "stramosi.out"
#define NMAX 25005
#define KMAX 20

int ANC[KMAX][NMAX];
int M, N, X, Y, P;

int main()
{
    freopen( in, "r", stdin );
    freopen( out, "w", stdout );
    
    scanf( "%d%d", &N, &M );
    int i, k;
    for ( i = 1; i <= N; ++i ) scanf( "%d", &ANC[0][i] );
    
    for ( k = 1; k <= KMAX; ++k )
        for ( i = 1; i <= N; ++i )
            ANC[ k ][ i ] = ANC[ k - 1 ][ ANC[ k - 1][ i ] ];//2^k = al 2^k-1 nod a celui de-al 2^k-1
                                                                     //nod, adica 2*(2^(k-1)) = 2^k    
    for ( ; M > 0; --M )
    {
        scanf( "%d%d", &X, &Y );    
        P = 20;
        while ( Y )
        {
              while ( (1<<P) > Y ) P--; 
              Y -= (1<<P);//scad cea mai apropiata putere a lui 2 mai mica ca Y 
              X = ANC[P][X];
        }
        printf( "%d\n", X );
    }
    return 0;
}