Pagini recente » Cod sursa (job #43713) | Cod sursa (job #778296) | Cod sursa (job #421974) | Cod sursa (job #2734823) | Cod sursa (job #3263416)
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> parcurgere;
void dfs(int node, const vector<vector<int>>& tree, int depth = 0) {
parcurgere.emplace_back(depth, node);
for (auto x : tree[node]) {
dfs(x, tree, depth + 1);
parcurgere.emplace_back(depth, node);
}
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, m;
cin >> n >> m;
vector<vector<int>> tree(n + 1);
for (int i = 2; i <= n; i++) {
int x;
cin >> x;
tree[x].push_back(i);
}
dfs(1, tree);
vector<int> poz_parcurgere(n+1);
for (int i = 0; i < parcurgere.size(); i++) {
poz_parcurgere[parcurgere[i].second] = i;
}
vector<vector<pair<int, int>>> rmq(__lg(n) + 1);
rmq[0] = move(parcurgere);
int size = rmq[0].size();
for (int i = 1; i < rmq.size(); i++) {
int offset = 1 << (i - 1);
rmq[i].resize(size);
for (int j = 0; j + offset < size; j++) {
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + offset]);
}
}
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
a = poz_parcurgere[a];
b = poz_parcurgere[b];
if (a > b)
swap(a, b);
int dist = b - a + 1;
int max_pow = __lg(dist);
cout << min(rmq[max_pow][a], rmq[max_pow][b - (1 << max_pow) + 1]).second << endl;
}
}