Pagini recente » Cod sursa (job #1592335) | Cod sursa (job #1531781) | Cod sursa (job #2914388) | Cod sursa (job #1863449) | Cod sursa (job #3201253)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int NM = 1e5 + 5;
int up[NM][20];
int n, m, sz, l;
vector<int>g[NM];
int in[4 * NM], out[4 * NM];
void dfs (int nod, int dad = 1) {
in[nod] = ++sz;
up[nod][0] = dad;
for (int i = 1; i <= l; i++) {
up[nod][i] = up[up[nod][i - 1]][i - 1];
}
for (int u : g[nod]) {
if (u != dad) {
dfs(u, nod);
}
}
out[nod] = ++sz;
}
bool is_ancestor (int u, int v) {
return in[u] <= in[v] && out[u] >= out[v];
}
int query (int u, int v) {
if (is_ancestor(u, v)) {
return u;
}
if (is_ancestor(v, u)) {
return v;
}
for (int i = l; i >= 0; i--) {
if (!is_ancestor(up[u][i], v)) {
u = up[u][i];
}
}
return up[u][0];
}
int main() {
fin >> n >> m;
l = ceil(log2(n));
for (int i = 2; i <= n; i++) {
int x; fin >> x;
g[x].push_back(i);
}
dfs(1);
while (m--) {
int x, y;
fin >> x >> y;
fout << query(x, y) << '\n';
}
}