Pagini recente » Cod sursa (job #1920752) | Autentificare | Cod sursa (job #1390970) | Cod sursa (job #1932151) | Cod sursa (job #2134229)
#include <bits/stdc++.h>
#define dim 100005*2
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n , query , rmq[25][dim], nivel[dim], pozitie[dim] ,m;
vector < int > G[dim];
int LOG[dim];
void Input ()
{ //citirea
in >> n >> query;
for ( int i = 2 ; i <= n ; ++i )
{ int x;
in >>x ;
G[x].push_back(i);
}
}
void DFS( int nod , int niv)
{
rmq [0] [ ++m ] = nod ;
nivel [ nod ] = niv ;
pozitie [ nod ] = m;
for ( size_t j = 0 ; j < G[nod] . size() ; ++j)
{
DFS( G[nod][j] , niv+1 ) ;
rmq [0] [ ++m ] = nod ;
nivel [ nod ] = niv ;
}
}
void RMQ()
{
LOG[ 1 ] = 0 ;
for ( int i = 2 ; i <= m ; ++i )
LOG [i] = LOG[i/2]+1;
for ( int i =1 ; i <= LOG[m] ;++ i )
for ( int j = 1 ; j <= m-( 1 << ( i-1 ) ) ;++ j )
{
if( nivel[rmq [i-1][j]] < nivel [rmq [ i-1 ][ j+ ( 1 << ( i-1 ) ) ] ])
rmq [i][j]=rmq[i-1][j];
else rmq[i][j]=rmq [ i-1 ][ j+ ( 1 << ( i-1 ) ) ];
//dinamica
}
}
void LCA ( int x , int y )
{
int a = pozitie[ x ] ;
int b = pozitie [ y ];
if ( b<a)swap (a,b);
int k = LOG[b-a+1];
if ( nivel[rmq[k][a]]>nivel[rmq[k][b-(1<<k)+1]] )
out << rmq [k][b-(1<<k)+1]<<"\n";
else out << rmq[k][a]<<"\n";
}
int main()
{
Input();
DFS(1,0);
RMQ();
for ( int i =1 ; i <= query ; ++i)
{
int x,y;
in>>x>>y;
LCA(x,y);
}
return 0;
}