Pagini recente » Cod sursa (job #2268282) | Cod sursa (job #2374059) | Cod sursa (job #3236587) | Profil Cristina-Elena | Cod sursa (job #3288122)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ( "lca.in" );
ofstream fout( "lca.out" );
#define cin fin
#define cout fout
#define FR( a, b) for( int a = 0; a < b; a ++ )
#define FOR( a, c, b ) for( int a = c ; a < b; a++ )
#define PB push_back
const int Nmax = 1e5 + 5, INF = 1e9;
int ancestor[17][Nmax], adancime[Nmax];
vector<int> sons[Nmax];
queue<int> q;
int lca( int u, int v ) {
if( u == v )
return u;
for( int j = 16; j >= 0; j -- )
if( ancestor[j][u] != 0 && ancestor[j][u] != ancestor[j][v] ) {
u = ancestor[j][u];
v = ancestor[j][v];
}
return ancestor[0][u];
}
int main()
{
int n, queries, nod, u, v;
cin >> n >> queries;
FOR( i, 2, n + 1 ) {
cin >> nod;
ancestor[0][i] = nod;
sons[nod].PB( i );
adancime[i] = INF;
}
adancime[0] = -1;
adancime[1] = 0;
q.push( 1 );
while( !q.empty() ) {
nod = q.front();
q.pop();
FR( i, sons[nod].size() ) {
int son = sons[nod][i];
q.push( son );
adancime[son] = adancime[nod] + 1;
}
}
FOR( i, 1, 17 ) {
FOR( nod, 2, n + 1 )
ancestor[i][nod] = ancestor[i-1][ ancestor[i-1][nod] ];
}
FR( i, queries ) {
cin >> u >> v;
if( adancime[u] < adancime[v] )
swap( u, v );
for( int i = 16; i >= 0; i -- )
if( adancime[ancestor[i][u]] >= adancime[v] )
u = ancestor[i][u];
cout << lca( u, v ) << "\n";
}
return 0;
}