Pagini recente » Cod sursa (job #2942014) | Cod sursa (job #123730) | Cod sursa (job #1244901) | Cod sursa (job #286252) | Cod sursa (job #3170307)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMAX = 1e5 + 5, LOG = 17;
int tata[NMAX][50], nivel[NMAX];
int get_level(int nod) {
if (nod == 0)
return 0;
if (nivel[nod] == 0)
nivel[nod] = get_level(tata[nod][0]) + 1;
return nivel[nod];
}
int lca(int a, int b) {
if (get_level(a) < get_level(b)) {
swap(a, b);
}
int dif = nivel[a] - nivel[b];
for (int p = LOG; p >= 0; p--) {
if ((dif & (1 << p)))
a = tata[a][p];
}
if (a == b)
return a;
for (int p = LOG; p >= 0; p--) {
if (tata[a][p] != tata[b][p]) {
a = tata[a][p];
b = tata[b][p];
}
}
return tata[a][0];
}
int main() {
int n, m;
fin >> n >> m;
for (int i = 2; i <= n; i++) {
fin >> tata[i][0];
}
for (int p = 1; p <= LOG; p++) {
for (int i = 1; i <= n; i++) {
tata[i][p] = tata[tata[i][p - 1]][p - 1];
}
}
while (m--) {
int a, b;
fin >> a >> b;
fout << lca(a, b) << '\n';
}
return 0;
}