Pagini recente » Borderou de evaluare (job #228049) | Cod sursa (job #1298913) | Cod sursa (job #2926337) | Cod sursa (job #1640660) | Cod sursa (job #1214609)
#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;
}