Pagini recente » Cod sursa (job #597524) | Cod sursa (job #1940281) | Cod sursa (job #1026478) | Cod sursa (job #1498933) | Cod sursa (job #2896963)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 100005
#define LOGMAX 30
#define problem "lca"
vector<int> G[NMAX];
int last[NMAX], t, rmq[LOGMAX][2 * NMAX], lg[2 * NMAX];
void dfs(int n) {
last[n] = ++t;
rmq[0][t] = n;
for (int neigh : G[n]) {
dfs(neigh);
last[n] = ++t;
rmq[0][t] = n;
}
}
int main() {
freopen(problem ".in", "r", stdin);
freopen(problem ".out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 2, x; i <= n; ++i) {
scanf("%d", &x);
G[x].push_back(i);
}
dfs(1);
for (int i = 2; i <= 2 * n - 1; ++i)
lg[i] = lg[i / 2] + 1;
for (int i = 1; (1 << i) <= 2 * n - 1; ++i)
for (int j = 1; j + (1 << i) <= 2 * n; ++j)
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
for (int i = 1, x, y; i <= m; ++i) {
scanf("%d%d", &x, &y);
int left = min(last[x], last[y]), right = max(last[x], last[y]), lg_len = lg[right - left + 1];
printf("%d\n", min(rmq[lg_len][left], rmq[lg_len][right + 1 - (1 << lg_len)]));
}
}