Pagini recente » Cod sursa (job #1589308) | Cod sursa (job #2885939) | Cod sursa (job #1743185) | Cod sursa (job #2963807) | Cod sursa (job #1654107)
#include <fstream>
#include <list>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
list<int>G[100010];
int rmq[19][200010],i,j,n,l[200010],x,v[200010],lg[200010],m,y,k,p[100010];
void dfs( int nod, int lev )
{
l[ nod ] = lev;
v[ ++v[ 0 ] ] = nod;
p[ nod ] = v[ 0 ];
for( auto it : G[ nod ] )
{
dfs( it , lev + 1 );
v[ ++v[ 0 ] ] = nod;
}
}
int main()
{
fin>>n>>m;
for( i = 2 ; i <= n ; i++ )
{
fin>>x;
G[ x ].push_back( i );
}
dfs( 1 , 0 );
n = v[ 0 ];
for( i = 2 ; i <= n ; i++ )
lg[ i ] = lg[ i / 2 ] + 1;
for( i = 1 ; i <= n ; i++ )
rmq[ 0 ][ i ] = v[ i ];
for( i = 1 ; i <= lg[ n ] ; i++ )
for( j = 1 ; j <= n ; j++ )
if( l[ rmq[ i - 1 ][ j ] ] < l[ 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 ) ) ];
for( i = 1 ; i <= m ; i++ )
{
fin>>x>>y;
x = p[ x ];
y = p[ y ];
k = lg[ y - x ];
if( l[ rmq[ k ][ x ] ] < l[ rmq[ k ][ y - ( 1 << k ) + 1 ] ] )
fout<<rmq[ k ][ x ]<<'\n';
else
fout<<rmq[ k ][ y - ( 1 << k ) + 1 ]<<'\n';
}
return 0;
}