Pagini recente » Cod sursa (job #147461) | Cod sursa (job #1962819) | Cod sursa (job #852382) | Cod sursa (job #1791759) | Cod sursa (job #3164314)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
#define nmax 100005
int parent[20][nmax], adancime[nmax], v[nmax];
int stramos( int p, int q ) {
//p-lea stramos al lui q
int j;
for( j = 17; j >= 0; j-- ) {
if( (1 << j) <= p ) {
q = parent[j][q];
p -= (1 << j);
}
}
return q;
}
int main() {
//ifstream cin("lca.in");
//ofstream cout("lca.out");
int n, i, j, m, x, y;
cin >> n >> m;
for( i = 2; i <= n; i++ ) {
cin >> v[i];
parent[0][i] = v[i];
adancime[i] = adancime[v[i]] + 1;
}
for( i = 1; i < 18; i++ ) {
for( j = 1; j <= n; j++ )
parent[i][j] = parent[i-1][parent[i-1][j]];
}
for( i = 0; i < m; i++ ) {
cin >> x >> y;
//cout << "test " << i << " " << adancime[x] << " " << adancime[y] << "\n";
if( adancime[x] > adancime[y] )
x = stramos( adancime[x]-adancime[y], x );
else
y = stramos( adancime[y]-adancime[x], y );
//cout << x << " " << y << "\n";
for( j = 17; j >= 0; j-- ) {
if( (1 << j) <= adancime[x] && parent[j][x] != parent[j][y] ) {
x = parent[j][x];
y = parent[j][y];
}
}
if( x == y )
cout << x << "\n";
else
cout << parent[0][x] << "\n";
}
return 0;
}