Pagini recente » Cod sursa (job #3140215) | Cod sursa (job #2142088) | Cod sursa (job #2604898) | Cod sursa (job #2300231) | Cod sursa (job #3206060)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n, m, x, y;
vector<int> v[100005];
int up[100005][30];
int td[100005], tf[100005];
int t = 0;
int hmax = 0;
int log(int x) {
int ans = 0;
while ((1 << ans) < x) {
ans++;
}
return ans;
}
void dfs(int node, int last) {
td[node] = ++t;
up[node][0] = last;
for (int i = 1; i <= hmax; i++)
up[node][i] = up[up[node][i - 1]][i - 1];
for (auto it : v[node])
if (it != last) {
dfs(it, node);
}
tf[node] = ++t;
}
bool isAncestor(int x, int y) {
return td[x] <= td[y] && tf[x] >= tf[y];
}
int lca(int x, int y) {
if (isAncestor(x, y))
return x;
if (isAncestor(y, x))
return y;
for (int i = hmax; i >= 0; i--) {
if (!isAncestor(up[x][i], y))
x = up[x][i];
}
return up[x][0];
}
int main()
{
in >> n >> m;
for (int i = 2; i <= n; i++) {
in >> x;
v[x].push_back(i);
}
hmax = log(n);
dfs(1, 1);
while (m--) {
in >> x >> y;
out << lca(x, y) << '\n';
}
return 0;
}