Cod sursa(job #2323287)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 19 ianuarie 2019 00:47:41
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#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" ;
    }

}