Pagini recente » Cod sursa (job #1500690) | Cod sursa (job #1813953) | Cod sursa (job #1641343) | Cod sursa (job #1759744) | Cod sursa (job #1500692)
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
const int Nmax = (int) 1e5;
const int NIL = -1;
vector <int> adj[Nmax];
int father[Nmax], d[Nmax], gr[Nmax];
int sqrtN;
void DFS(int u, int group) {
gr[u] = group;
if (d[u] % sqrtN == 0) {
group = u;
}
for (auto v : adj[u]) {
d[v] = d[u] + 1;
DFS(v, group);
}
}
int inline lca(int u, int v) {
while (gr[u] != gr[v]) {
if (d[u] > d[v]) {
u = gr[u];
} else {
v = gr[v];
}
}
while (u != v) {
if (d[u] > d[v]) {
u = father[u];
} else {
v = father[v];
}
}
return u;
}
int main(void) {
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
int n, m;
int u, v;
scanf("%d%d", &n, &m);
for (int i = 1; i < n; i++) {
scanf("%d", &u);
adj[u - 1].emplace_back(i);
father[i] = u - 1;
}
sqrtN = (int) sqrt(n - 1) + 1;
DFS(0, 0);
for (int i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
printf("%d\n", lca(u - 1, v - 1) + 1);
}
fclose(stdin);
fclose(stdout);
return 0;
}