Pagini recente » Cod sursa (job #860495) | Rating Szasz Attila (atiyka) | Cod sursa (job #1835617) | Cod sursa (job #897872) | Cod sursa (job #1214614)
#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;
}