Pagini recente » Statistici Marcus Dion (ckarlobencoll60) | Atasamentele paginii Profil alinavoro | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #3358025)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 100005;
const int LOGMAX = 18;
int n, m;
vector<int> g[NMAX];
int euler[2 * NMAX], euler_len;
int first_pos[NMAX];
int depth[NMAX];
void dfs(int u, int d) {
first_pos[u] = euler_len;
euler[euler_len++] = u;
depth[u] = d;
for (int v : g[u]) {
dfs(v, d + 1);
euler[euler_len++] = u;
}
}
int lg[2 * NMAX];
int rmq[LOGMAX][2 * NMAX];
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 2; i <= n; i++) {
int tata;
scanf("%d", &tata);
g[tata].push_back(i);
}
dfs(1, 0);
int sz = euler_len;
for (int i = 0; i < sz; i++) {
rmq[0][i] = euler[i];
}
for (int i = 2; i <= sz; i++) {
lg[i] = lg[i / 2] + 1;
}
for (int j = 1; (1 << j) <= sz; j++) {
for (int i = 0; i + (1 << j) <= sz; i++) {
int u = rmq[j - 1][i];
int v = rmq[j - 1][i + (1 << (j - 1))];
rmq[j][i] = depth[u] < depth[v] ? u : v;
}
}
while (m--) {
int x, y;
scanf("%d %d", &x, &y);
int l = first_pos[x], r = first_pos[y];
if (l > r) swap(l, r);
int k = lg[r - l + 1];
int u = rmq[k][l];
int v = rmq[k][r - (1 << k) + 1];
int ans = depth[u] < depth[v] ? u : v;
printf("%d\n", ans);
}
return 0;
}