Pagini recente » Cod sursa (job #3324773) | Cod sursa (job #1673493) | Cod sursa (job #2132557) | Cod sursa (job #1820350) | Cod sursa (job #3308888)
#include <bits/stdc++.h>
using namespace std;
vector<int> child[100005];
vector<pair<int, int>> queries[100005];
int par[100005], siz[100005], viz[100005], ancestor[100005];
int ans[2000005];
int find(int u) {
if (u == par[u]) return u;
return par[u] = find(par[u]);
}
void unite(int u, int v) {
u = find(u);
v = find(v);
if (siz[u] > siz[v])
swap(u, v);
par[u] = v;
siz[v] += siz[u];
}
void dfs(int u) {
viz[u] = 1;
ancestor[u] = u;
for (int v : child[u]) {
dfs(v);
unite(u, v);
ancestor[find(u)] = u;
}
for (auto [v, id] : queries[u]) {
if (viz[v]) {
ans[id] = ancestor[find(v)];
}
}
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, q;
cin >> n >> q;
par[1] = 1;
siz[1] = 1;
for (int i = 2; i <= n; i++) {
par[i] = i;
siz[i] = 1;
int x;
cin >> x;
child[x].push_back(i);
}
for (int i = 1; i <= q; i++) {
int u, v;
cin >> u >> v;
queries[u].push_back({v, i});
queries[v].push_back({u, i});
}
dfs(1);
for (int i = 1; i <= q; i++)
cout << ans[i] << '\n';
return 0;
}