Pagini recente » Cod sursa (job #541163) | Cod sursa (job #3031486) | Cod sursa (job #1169281) | Cod sursa (job #2335674) | Cod sursa (job #925597)
Cod sursa(job #925597)
#include <cstdio>
#include <cassert>
#include <vector>
using namespace std;
#define MAX_N 100001
#define LOG_MAX_N 18
int n, m;
int father[LOG_MAX_N][MAX_N];
vector <int> v[MAX_N];
int level[MAX_N];
void read() {
assert(scanf("%d%d", &n, &m) == 2);
for (int i = 2; i <= n; ++i) {
assert(scanf("%d", &father[0][i]) == 1);
v[father[0][i]].push_back(i);
}
}
void set_father() {
for (int j = 1; (1 << j) <= n; ++j)
for (int i = 1; i <= n; ++i)
father[j][i] = father[j - 1][father[j - 1][i]];
}
void dfs(int node, int lvl) {
level[node] = lvl;
for (vector <int>::iterator it = v[node].begin(); it != v[node].end(); ++it)
dfs(*it, lvl + 1);
}
int lca(int a, int b) {
if (a == b)
return a;
if (level[a] < level[b])
swap(a, b);
for (int i = LOG_MAX_N; i >= 0; --i)
if (level[a] - (1 << i) >= level[b])
a = father[i][a];
if (a == b)
return a;
for (int i = LOG_MAX_N; i >= 0; --i)
if (father[i][a] && father[i][a] != father[i][b]) {
a = father[i][a];
b = father[i][b];
}
return father[0][a];
}
int main() {
assert(freopen("lca.in", "r", stdin));
assert(freopen("lca.out", "w", stdout));
read();
set_father();
dfs(1, 0);
while (m) {
int a, b;
assert(scanf("%d%d\n", &a, &b) == 2);
printf("%d\n", lca(a, b));
--m;
}
}