Pagini recente » Cod sursa (job #625395) | Cod sursa (job #2708442) | Cod sursa (job #579722) | Diferente pentru implica-te/arhiva-educationala intre reviziile 223 si 48 | Cod sursa (job #2397806)
#include <bits/stdc++.h>
using namespace std;
int n, q, timer, l;
int tin[1<<20], tout[1<<17], up[1<<17][50];
vector<int> g[1<<17];
void dfs(int u, int p) {
tin[u] = ++timer;
up[u][0] = p;
for (int i = 1; i <= l; i++)
up[u][i] = up[up[u][i-1]][i-1];
for (auto v : g[u]) dfs(v,u);
tout[u] = ++timer;
}
bool ancestor(int u, int v) {
return tin[u] <= tin[v] && tout[u] >= tout[v];
}
int lca(int u, int v) {
if (ancestor(u,v)) return u;
if (ancestor(v,u)) return v;
for (int i = l; i >= 0; i--) {
if (!ancestor(up[u][i],v)) u = up[u][i];
}
return up[u][0];
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
cin >> n >> q;
l = ceil(log2(n));
for (int i = 1; i < n; i++) {
int v;
cin >> v;
v--;
g[v].push_back(i);
}
dfs(0,0);
while (q--) {
int u, v;
cin >> u >> v;
u--, v--;
cout << lca(u,v) + 1 << '\n';
}
}