Pagini recente » Cod sursa (job #1802438) | Cod sursa (job #674361) | Cod sursa (job #62823) | Cod sursa (job #498847) | Cod sursa (job #2427269)
#include <bits/stdc++.h>
using namespace std;
int n, timer;
vector<vector<int>> graph, qrs;
vector<int> finish, link, answer;
vector<pair<int, int>> queries;
int Find(int x) {
if (link[x] == -1) return x;
return link[x] = Find(link[x]);
}
void Union(int son, int node) {
link[Find(son)] = Find(node);
}
void DFS(int node, int par) {
for (auto vec : graph[node]) {
if (vec == par) continue;
DFS(vec, node);
Union(vec, node);
}
finish[node] = timer++;
for (auto i : qrs[node]) {
int oth = node ^ queries[i].first ^ queries[i].second;
if (finish[oth] != -1)
answer[i] = Find(oth);
}
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
int q; cin >> n >> q;
queries.resize(q); answer.resize(q);
graph.resize(n); qrs = graph;
finish.assign(n, -1); link = finish;
timer = 0;
for (int i = 1; i < n; ++i) {
int par; cin >> par;
graph[par - 1].push_back(i);
}
for (int i = 0; i < q; ++i) {
int a, b; cin >> a >> b; --a; --b;
queries[i] = {a, b};
qrs[a].push_back(i);
qrs[b].push_back(i);
}
DFS(0, -1);
for (auto x : answer)
cout << x + 1 << '\n';
return 0;
}