Pagini recente » Cod sursa (job #3209930) | Cod sursa (job #1982106) | Cod sursa (job #2645906) | Cod sursa (job #2140019) | Cod sursa (job #2565429)
#include<bits/stdc++.h>
using namespace std;
FILE * fin = fopen("lca.in","r");
FILE * fout = fopen("lca.out","w");
const int DIM = 1e5 + 5;
int N, M, niv[DIM], euler[2 * DIM], pos[DIM], rmq[19][2 * DIM], K, P[2 * DIM];
vector<int> edge[DIM];
void dfs( int nod ){
for( int i = 0; i < edge[nod].size(); i++ ){
niv[ edge[nod][i] ] = niv[nod] + 1;
dfs( edge[nod][i] );
}
return;
}
void dfs1( int nod ){
euler[++K] = nod;
if( pos[nod] == 0 )
pos[nod] = K;
for( int i = 0; i < edge[nod].size(); i++ ){
dfs1( edge[nod][i] );
euler[++K] = nod;
}
return;
}
int main(){
fscanf( fin, "%d%d", &N, &M );
for( int i = 2; i <= N; i++ ){
int x; fscanf( fin, "%d", &x );
edge[x].push_back( i );
}
dfs( 1 );
dfs1( 1 );
for( int i = 1; i <= K; i++ )
rmq[0][i] = euler[i];
for( int i = 1; (1<<i) <= K; i++ ){
for( int j = 1; j + (1<<(i-1)) <= K; j++ ){
if( niv[ rmq[i - 1][j] ] < niv[ 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))];
}
}
P[1] = 0;
for( int i = 2; i <= K; i++ )
P[i] = P[i / 2] + 1;
for( int i = 1; i <= M; i++ ){
int a, b; fscanf( fin, "%d%d", &a, &b );
if( pos[a] > pos[b] )
swap( a, b );
a = pos[a];
b = pos[b];
int put = P[b - a + 1];
if( niv[ rmq[put][a] ] < niv[ rmq[put][b - (1<<put) + 1] ] )
fprintf( fout, "%d\n", rmq[put][a] );
else
fprintf( fout, "%d\n", rmq[put][b - (1<<put) + 1] );
}
return 0;
}