Pagini recente » Cod sursa (job #203214) | Cod sursa (job #1586633) | Cod sursa (job #887047) | Cod sursa (job #1274736) | Cod sursa (job #2846672)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<vector<int>> rmq;
vector<vector<int>> g;
vector<int> tin;
vector<int> tout;
int n, q,cnt;
void dfs(int node, int parent) {
rmq[node][0] = parent;
for (int i = 1; i <= 19; ++i) {
rmq[node][i] = rmq[rmq[node][i - 1]][i - 1];
}
tin[node] = cnt++;
for (auto i : g[node]) {
if (i != parent) {
dfs(i, node);
}
}
tout[node] = cnt++;
}
int lca(int a, int b) {
auto ancestor = [&](int a, int b) {
return (tin[a] <= tin[b] && tout[a] >= tout[b]);
};
if (ancestor(a, b))
return a;
if (ancestor(b, a))
return b;
for (int i = 19; i >= 0; --i) {
if (!ancestor(rmq[a][i], b)) {
a = rmq[a][i];
}
}
return rmq[a][0];
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
fin >> n >> q;
g = vector<vector<int>>(n + 1);
rmq = vector<vector<int>>(n + 1, vector<int>(20));
tin = tout = vector<int>(n + 1);
for (int i = 2; i <= n; ++i) {
int x;
fin >> x;
g[x].push_back(i);
g[i].push_back(x);
}
dfs(1, 1);
while (q--) {
int a, b;
fin >> a >> b;
fout << lca(a, b) << '\n';
}
}