Pagini recente » Cod sursa (job #2333193) | Cod sursa (job #505663) | Cod sursa (job #1146801) | Cod sursa (job #752288) | Cod sursa (job #2412396)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int DIM = 1e5 + 5;
int N, M, E[2 * DIM], F[2 * DIM], Rmq[20][2 * DIM], Niv[2 * DIM], K, P[2 * DIM];
vector<int> edge[DIM];
void dfs( int nod, int nv ){
Niv[nod] = nv;
E[++K] = nod;
F[nod] = K;
for( int i = 0; i < edge[nod].size(); i++ ){
dfs( edge[nod][i], nv + 1 );
E[++K] = nod;
}
}
int main(){
fin >> N >> M;
for( int i = 2; i <= N; i++ ){
int x; fin >> x;
edge[x].push_back( i );
}
dfs( 1, 1 );
for( int i = 1; i <= K; i++ )
Rmq[0][i] = i;
for( int i = 1; (1<<i) <= K; i++ ){
for( int j = 1; j <= K; j++ ){
Rmq[i][j] = Rmq[i - 1][j];
if( j + (1<<i) <= K && Niv[ E[ Rmq[i][j] ] ] > Niv[ E[ Rmq[i - 1][j + (1<<(i - 1))] ] ] )
Rmq[i][j] = Rmq[i - 1][j + (1<<(i - 1))];
}
}
/*
for( int i = 0; (1<<i) <= K; i++, fout << "\n" )
for( int j = 1; j <= K; j++, fout << " " ){
if( Rmq[i][j] < 10 )
fout << " ";
fout << Rmq[i][j];
}*/
P[1] = 0;
for( int i = 2; i <= K; i++ )
P[i] = P[i / 2] + 1;
for( int t = 1; t <= M; t++ ){
int x, y; fin >> x >> y;
if( F[x] > F[y] )
swap( x, y );
x = F[x];
y = F[y];
int put = P[y - x + 1];
if( Niv[ E[ Rmq[put][x] ] ] < Niv[ E[ Rmq[put][y - (1<<put) + 1] ] ] )
fout << E[ Rmq[put][x] ] << "\n";
else
fout << E[ Rmq[put][y - (1<<put) + 1] ] << "\n";
}
return 0;
}