Pagini recente » Cod sursa (job #995540) | Cod sursa (job #1040890) | Cod sursa (job #2297151) | Cod sursa (job #975025) | Cod sursa (job #2786641)
#include <fstream>
using namespace std;
int par[100001], s[100001][25], h[100001];
int FindRuda( int x, int h ) {
if( h == 0 )
return x;
int put = 1;
while( ( 1 << put ) <= h ) {
put++;
}
put--;
return FindRuda( s[x][put], h - ( 1 << put ) );
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, m, i, j, a, b, st, dr, mij, x, y, last;
cin>>n>>m;
h[1] = 0;
for( i = 2; i <= n; i++ ) {
cin>>a;
h[i] = h[a] + 1;
s[i][0] = a;
}
s[1][1] = 0;
i = 1;
while( ( 1 << i ) <= n ) {
for( j = 1; j <= n; j++ ) {
s[j][i] = s[s[j][i - 1]][i - 1];
}
i++;
}
while( m-- ) {
cin>>a>>b;
if( h[a] < h[b] ) {
a = FindRuda( a, h[b] - h[a] );
} else {
b = FindRuda( b, h[a] - h[b] );
}
dr = h[a];
st = 1;
while(st <= dr ) {
mij = ( dr + st ) / 2;
x = FindRuda( a, mij );
y = FindRuda( b, mij );
if( x == y ) {
dr = mij - 1;
last = x;
} else st = mij + 1;
}
cout<<last<<"\n";
}
return 0;
}