Cod sursa(job #2323273)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 19 ianuarie 2019 00:26:33
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
#define pb push_back
#define sz size()
using namespace std ;
const int NR = 100001 ;
ifstream f ("darb.in") ;
ofstream g ("darb.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" ;
    }

}