Pagini recente » Cod sursa (job #2542631) | Cod sursa (job #1901480) | Cod sursa (job #2687401) | Cod sursa (job #167143) | Cod sursa (job #2310667)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define pb push_back
#define sz size()
using namespace std ;
const int NR = 100001 ;
ifstream f ("lca.in") ;
ofstream g ("lca.out") ;
vector < int > v [ NR ] ;
vector < int > level ( NR ) ;
vector < int > euler ( 2 * NR ) ;
vector < int > firstap ( NR ) ;
int n , q , cnt ;
void input()
{
f >> n >> q ;
for ( int i = 2 ; i <= n ; ++ i )
{
int father ;
f >> father ;
v [ father ].pb( i ) ;
}
level [ 0 ] = -1 ;
}
void dfs ( int nod , int father )
{
level [ nod ] = level [ father ] + 1 ;
euler [ ++ cnt ] = nod ;
firstap [ nod ] = cnt ;
for ( size_t i = 0 ; i < v[ nod ].sz ; ++ i )
{
dfs ( v [ nod ][ i ] , nod ) ;
euler [ ++ cnt ] = nod ;
}
}
int a[ 2 * NR ][ 20 ] ;
int lg [ 2 * NR ] ;
void rmq ()
{
a [ 1 ][ 0 ] = euler [ 1 ] ;
for ( int i = 2 ; i <= cnt ; ++ i )
{
lg [ i ] = lg [ i >> 1 ] + 1 ;
a [ i ][ 0 ] = euler [ i ] ;
}
for( int j = 1 ; ( 1 << j ) <= cnt ; ++ j )
for( int i = 1 ; i + ( 1 << j ) < cnt ; ++ i )
{
a [ i ][ j ] = a [ i ][ j - 1 ] ;
if ( level [ a [ i ][ j ] ] > level [ a [ i + ( 1 << ( j - 1 ) ) ][ j - 1 ] ] )
a[ i ][ j ] = a [ i + ( 1 << ( j - 1 ) ) ][ j - 1 ] ;
}
}
void task ( int x , int y )
{
int st = firstap [ x ] ;
int dr = firstap [ y ] ;
if ( st > dr ) swap ( st , dr ) ;
int i = lg [ dr - st + 1 ] ;
if ( level [ a [ st ][ i ] ] < level [ a [ dr - ( 1 << i ) + 1 ][ i ] ] )
g << a [ st ][ i ] << "\n" ;
else
g << a [ dr - ( 1 << i ) + 1 ][ i ] << "\n" ;
}
void solve_tasks ()
{
while ( q -- )
{
int x , y ;
f >> x >> y ;
task ( x , y ) ;
}
}
int main ()
{
input() ;
dfs ( 1 , 0 ) ;
rmq() ;
solve_tasks() ;
return 0 ;
}