Pagini recente » Cod sursa (job #2775901) | Cod sursa (job #3130002) | Cod sursa (job #1506255) | Cod sursa (job #2310404) | Cod sursa (job #2427275)
#include <bits/stdc++.h>
using namespace std;
int n, timer;
vector<vector<int>> graph;
vector<vector<pair<int, int>>> qrs;
vector<int> finish, link, answer;
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 itr : qrs[node]) {
if (finish[itr.first] != -1)
answer[itr.second] = Find(itr.first);
}
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
int q; cin >> n >> q;
graph.resize(n);
qrs.resize(n);
finish.assign(n, -1);
link = finish;
timer = 0;
answer.resize(q);
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;
qrs[a].emplace_back(b, i);
qrs[b].emplace_back(a, i);
}
DFS(0, -1);
for (auto x : answer)
cout << x + 1 << '\n';
return 0;
}