Pagini recente » Cod sursa (job #430774) | Cod sursa (job #828510) | Cod sursa (job #326341) | Cod sursa (job #164205) | Cod sursa (job #1413493)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int maxn = 100005;
const int maxlg = 25;
int n, m, anc[maxlg][maxn], level[maxn];
inline int query(int x, int y) {
if(level[x] < level[y])
swap(x, y);
int diff = level[x] - level[y];
for(int i = 0 ; i < maxlg ; ++ i)
if(diff & (1 << i))
x = anc[i][x];
if(x == y)
return x;
for(int i = maxlg - 1 ; i >= 0 ; -- i)
if(anc[i][x] != anc[i][y]) {
x = anc[i][x];
y = anc[i][y];
}
return anc[0][x];
}
inline void solve_stramosi() {
fin >> n >> m;
level[1] = 1;
for(int i = 2 ; i <= n ; ++ i) {
fin >> anc[0][i];
level[i] = level[anc[0][i]] + 1;
}
for(int i = 1 ; i < maxlg ; ++ i)
for(int j = 1 ; j <= n ; ++ j)
anc[i][j] = anc[i - 1][anc[i - 1][j]];
for(int i = 1 ; i <= m ; ++ i) {
int x, y;
fin >> x >> y;
fout << query(x, y) << '\n';
}
}
int main() {
solve_stramosi();
///solve_hpd();
///solve_rmq();
///solve_aint();
}