Cod sursa(job #1214609)

Utilizator xtreme77Patrick Sava xtreme77 Data 30 iulie 2014 21:46:48
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 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 ;

using namespace std;

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

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

int ank [ MAX ] [ BITMAX ] ;

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 ;
}
int main( )
{
    int n , m ;
    fin >> n >> m ;
    for ( rint i = 1 ; i <= n ; ++ i ){
        int tata ;
        fin >> tata ;
        gr [ tata ].pb( i ) ;
        ank [ i ] [ 0 ] = tata ;
    }
    dfs ( 0 ) ;
    for ( ; m ; -- m ){
        int q , p ;
        fin >> q >> p;
        fout << query ( q , p ) << '\n' ;
    }
    return 0;
}