Cod sursa(job #129136)

Utilizator pishtymatei silviu pishty Data 28 ianuarie 2008 18:07:33
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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 );     
}