Pagini recente » Cod sursa (job #1082413) | Cod sursa (job #1212683) | Cod sursa (job #1217122) | Cod sursa (job #812090) | Cod sursa (job #2323277)
#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") ;
vector < int > v [ NR ] ;
int level [ NR ] , last ;
const int NMAX = 250 ;
const int LOGNMAX = 20;
void rmq__father ( int rmq_father[ LOGNMAX ][ NMAX ] , int Father [ NMAX ] , int n )
{
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 rmq_father [ LOGNMAX ][ NMAX ] , int nod , int nr , int log )
{
// log = log2 ( n )
// nr - cate muchii avem de urcat , nr < n => lg ( nr ) <= lg ( n )
while ( log -- )
if ( ( 1 << log ) & nr )
nod = rmq_father [ log ][ nod ] ;
//pentru fiecare bit i al lui nr , daca e 1 vom urca 2 ^ i nivele in arbore
return nod ;
}
int lg ( int n )
{
if ( n == 1 ) return 0 ;
return 1 + lg ( n >> 1 ) ;
}
int main ()
{
int n , q ;
int rmq_father [ NMAX ][ NMAX ] = {0} ;
int Father [ NMAX ] = { 0 };
f >> n >> q ;
int i , j ;
int log = lg ( n ) ;
for ( i = 1 ; i <= n ; ++ i ) f >> Father [ i ] ;
rmq__father(rmq_father , Father , n ) ;
while ( q -- )
{
int nod , nr ; f >> nod >> nr ;
g << query_father(rmq_father , nod , nr ,log ) << "\n" ;
}
}