Pagini recente » Cod sursa (job #276999) | Cod sursa (job #1307880) | Cod sursa (job #2484819) | Cod sursa (job #263415) | Cod sursa (job #3315175)
#include <bits/stdc++.h>
using namespace std;
struct nod{
int stramosi[20], adancime;
vector<int> copii;
};
nod graf[100005];
void dfs( int n ) {
for ( auto copil : graf[n].copii ) {
graf[copil].adancime = graf[n].adancime + 1;
dfs( copil );
}
}
int lg[100005];
void precalc_log ( int n ) {
for ( int i = 2; i <= n; i++ ) {
lg[i] = lg[i / 2] + 1;
}
}
void egniv ( int &a, int &b ) {
int ada = graf[a].adancime;
int adb = graf[b].adancime;
if ( adb > ada ) {
swap( a, b );
swap( ada, adb );
}
while ( adb < ada ) {
int lgniv = lg[ada - adb];
ada -= ( 1 << lgniv );
a = graf[a].stramosi[lgniv];
}
}
int findlca ( int a, int b ) {
egniv( a, b );
if( a == b )
return a;
int ad = graf[a].adancime;
for ( int lgput = lg[ad]; lgput >= 0; lgput-- ) {
if ( graf[a].stramosi[lgput] != graf[b].stramosi[lgput] ) {
a = graf[a].stramosi[lgput];
b = graf[b].stramosi[lgput];
}
}
return graf[a].stramosi[0];
}
ifstream fin( "lca.in" );
ofstream fout( "lca.out" );
int main() {
int n, k;
fin >> n >> k;
for ( int i = 2; i <= n; i++ ) {
fin >> graf[i].stramosi[0];
graf[graf[i].stramosi[0]].copii.push_back( i );
}
dfs( 1 );
precalc_log( n );
/*
for ( int nodcur = 1; nodcur <= n; nodcur++ ) {
graf[nodcur].stramosi[1] = graf[graf[nodcur].stramosi[0]].stramosi[0];
}
for ( int nodcur = 1; nodcur <= n; nodcur++ ) {
graf[nodcur.stramosi[2]] = graf[graf[graf[graf[nodcur].stramosi[0]].stramosi[0]].stramosi[0]].stramosi[0];
}
*/
for ( int lgput = 1; lgput <= lg[n]; lgput++ ) {
for ( int nodcur = 1; nodcur <= n; nodcur++ ) {
graf[nodcur].stramosi[lgput] = graf[graf[nodcur].stramosi[lgput - 1]].stramosi[lgput - 1];
}
}
for ( int i = 1; i <= k; i++ ) {
int x, y;
fin >> x >> y;
fout << findlca( x, y ) << '\n';
}
return 0;
}