Cod sursa(job #1214614)

Utilizator xtreme77Patrick Sava xtreme77 Data 30 iulie 2014 21:58:43
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <vector>
#include <bitset>

#define rint register int
#define pb push_back

const char IN [ ] = "stramosi.in";
const char OUT [ ] = "stramosi.out";
const int MAX = 250014 ;
const int BITMAX = 19 ;
const int BUFF = 33000014 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

vector < int > gr [ MAX ] ;
bitset < MAX > uz ;

int ank [ MAX ] [ BITMAX ] , cur ;

void dfs ( int nod )
{
   uz [ nod ] = 1 ;
   for ( rint i = 1 ; ank [ nod ] [ i ] = ank [ ank [ nod ] [ i - 1 ] ] [ i - 1 ] ; ++ i ) ;
   for ( auto i : gr [ nod ] )
       if( ! uz [ i ] )
            dfs ( i ) ;
}
int query ( int x , int y )
{
    for ( rint step = 17 ; step >= 0 ; step -- )
        if ( y >= (1<<step) )
            x = ank [ x ] [ step ] , y -= ( 1 << step );
    return x ;
}
char sir [ BUFF ] ;
int urm ( )
{
    int sol = 0 ;
    while ( sir [ cur ] and (sir [ cur ] <'0' or sir [ cur ] > '9') ) ++ cur ;
    for ( ; sir [ cur ] >= '0' and sir [ cur ] <= '9' ; ++cur )
        sol = sol * 10 + sir [ cur ] - '0' ;
    return sol ;
}
int main( )
{
    int n , m ;
    fin >> n >> m ;
    fin.getline(sir,BUFF,EOF);
    cur = 0 ;
    for ( rint i = 1 ; i <= n ; ++ i ){
        int tata ;
        tata = urm( );
        gr [ tata ].pb( i ) ;
        ank [ i ] [ 0 ] = tata ;
    }
    dfs ( 0 ) ;
    for ( ; m ; -- m ){
        int q , p ;
        q = urm ( ) ;
        p = urm ( ) ;
        fout << query ( q , p ) << '\n' ;
    }
    return 0;
}