Pagini recente » Cod sursa (job #454081) | Cod sursa (job #1756141) | Cod sursa (job #2246187) | Cod sursa (job #919163) | Cod sursa (job #3228634)
#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 tin[NM], tout[NM], timp;
int n, m, l;
vector<int>g[NM];
void dfs (int nod, int dad = 1) {
tin[nod] = ++timp;
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) {
continue;
}
dfs(u, nod);
}
tout[nod] = ++timp;
}
bool is_ancestor (int u, int v) {
return (tin[u] <= tin[v] && tout[u] >= tout[v]);
}
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 u, v; fin >> u >> v;
if (is_ancestor(u, v)) {
fout << u << '\n';
} else if (is_ancestor(v, u)) {
fout << v << '\n';
} else {
for (int i = l; i >= 0; i--) {
if (!is_ancestor(up[u][i], v)) {
u = up[u][i];
}
}
fout << up[u][0] << '\n';
}
}
}