Pagini recente » Cod sursa (job #1898710) | Cod sursa (job #2228919) | Cod sursa (job #98239) | Cod sursa (job #2531428) | Cod sursa (job #2323285)
#include <bits/stdc++.h>
#define pb push_back
#define sz size()
using namespace std ;
const int NR = 100001 ;
ifstream f ("stramosi.in") ;
ofstream g ("stramosi.out") ;
const int NMAX = 250005 ;
const int LOGNMAX = 20;
int rmq_father [ LOGNMAX ][ NMAX ] ;
int Father [ NMAX ] , n , log1 ;
void rmq ( )
{
int i , j ;
for ( i = 1 ; i <= n ; ++ i ) rmq_father [ 0 ][ i ] = Father [ i ] ;
// initializam
for ( i = 1 ; ( 1 << i ) <= n ; ++ i )
for ( j = 1 ; j <= n ; ++ j ) rmq_father [ i ][ j ] = rmq_father [ i - 1 ][ rmq_father [ i - 1 ][ j ] ] ;
}
int query_father( int nod , int nr )
{
// log = log2 ( n )
// nr - cate muchii avem de urcat , nr < n => lg ( nr ) <= lg ( n )
int k = log1 ;
while ( k -- )
if ( ( ( 1 << k ) & nr ) && nod )
nod = rmq_father [ k ][ nod ] ;
//pentru fiecare bit i al lui nr , daca e 1 vom urca 2 ^ i nivele in arbore
return nod ;
}
int lg ( int x )
{
if ( x == 1 ) return 0 ;
return 1 + lg ( x >> 1 ) ;
}
int main ()
{
int q ;
f >> n >> q ;
int i , j ;
log1 = lg ( n ) ;
for ( i = 1 ; i <= n ; ++ i ) f >> Father [ i ] ;
rmq( ) ;
while ( q -- )
{
int nod , nr ; f >> nod >> nr ;
g << query_father( nod , nr ) << "\n" ;
}
}