Pagini recente » Cod sursa (job #1927038) | Cod sursa (job #600302) | Cod sursa (job #1389535) | Cod sursa (job #2150257) | Cod sursa (job #2323287)
#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
int k ;
for ( k = 1 ; ( 1 << k ) <= n ; k ++ ) ;
log1 = k ;
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 = rmq_father [ k ][ nod ] ;
//pentru fiecare bit i al lui nr , daca e 1 vom urca 2 ^ i nivele in arbore
return nod ;
}
int main ()
{
int q ;
f >> n >> q ;
int i , j ;
for ( i = 1 ; i <= n ; ++ i ) f >> Father [ i ] ;
rmq( ) ;
while ( q -- )
{
int nod , nr ; f >> nod >> nr ;
g << query_father( nod , nr ) << "\n" ;
}
}