Pagini recente » Cod sursa (job #102156) | Cod sursa (job #3209123) | Cod sursa (job #2063069) | Cod sursa (job #2971005) | Cod sursa (job #2409652)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int DIM = 1e5 + 5;
int N, Niv[DIM], Rmq[20][DIM], M, Log;
vector<int> edge[DIM];
void dfs( int nod, int nv ){
Niv[nod] = nv;
for( int i = 0; i < edge[nod].size(); i++ )
dfs( edge[nod][i], nv + 1 );
}
inline int lca( int x, int y ){
if( Niv[x] > Niv[y] )
swap( x, y );
for( int k = Log; k >= 0; k-- )
if( Niv[ Rmq[k][y] ] >= Niv[x] )
y = Rmq[k][y];
if( x == y )
return x;
for( int k = Log; k >= 0; k-- ){
if( Rmq[k][x] != Rmq[k][y] ){
x = Rmq[k][x];
y = Rmq[k][y];
}
}
if( x == y )
return x;
return Rmq[0][x];
}
int main(){
fin >> N >> M;
for( int i = 2; i <= N; i++ ){
fin >> Rmq[0][i];
edge[ Rmq[0][i] ].push_back( i );
}
Log = 0;
while( (1<<Log) <= N )
Log++;
dfs( 1, 1 );
for( int k = 1; k <= Log; k++ )
for( int i = 1; i <= N; i++ )
Rmq[k][i] = Rmq[k - 1][ Rmq[k - 1][i] ];
for( int i = 1; i <= M; i++ ){
int x, y; fin >> x >> y;
fout << lca( x, y ) << "\n";
}
return 0;
}