Pagini recente » Cod sursa (job #1504234) | Cod sursa (job #2518530) | Cod sursa (job #751738) | Cod sursa (job #2514480) | Cod sursa (job #3308893)
#include <bits/stdc++.h>
using namespace std;
vector<int> child[100005];
int h[100005];
int euler[200005];
int firstpoz[100005], lg[200005];
pair<int, int> rmq[18][200005];
int currt;
void dfs(int u) {
euler[++currt] = u;
firstpoz[u] = currt;
for (int v : child[u]) {
dfs(v);
euler[++currt] = u;
}
}
void get_rmq(int n) {
for (int i = 1; i <= n; i++) {
rmq[0][i] = {h[euler[i]], euler[i]};
}
for (int b = 1; (1 << b) < 18; b++) {
for (int i = 1; i + (1 << b) - 1 <= n; i++) {
rmq[b][i] = min(rmq[b - 1][i], rmq[b - 1][i + (1 << (b - 1))]);
}
}
}
int solve(int l, int r) {
int lglen = lg[r - l + 1];
if (rmq[lglen][l].first < rmq[lglen][r - (1 << lglen) + 1].first) {
return rmq[lglen][l].second;
}
return rmq[lglen][r - (1 << lglen) + 1].second;
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
for (int i = 2; i <= 200000; i++) {
lg[i] = lg[i / 2] + 1;
}
int n, q;
cin >> n >> q;
h[1] = 1;
for (int i = 2; i <= n; i++) {
int a;
cin >> a;
child[a].push_back(i);
h[i] = h[a] + 1;
}
dfs(1);
get_rmq(2 * n - 1);
while (q--) {
int u, v;
cin >> u >> v;
cout << solve(firstpoz[u], firstpoz[v]);
}
return 0;
}