Pagini recente » Cod sursa (job #939069) | Cod sursa (job #3292046) | Cod sursa (job #284956) | Cod sursa (job #2885372) | Cod sursa (job #3030466)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int N = 2e5 + 5;
int tour[2 * N], pos[N], dep[N];
int lg[2 * N], rmq[25][2 * N];
int n, q, m;
vector<int> g[N];
void dfe(int u, int p) {
tour[++m] = u;
pos[u] = m;
dep[u] = dep[p] + 1;
for (auto v : g[u])
if (v != p) {
dfe(v, u);
tour[++m] = u;
}
}
int mindep(int u, int v) {
return (dep[u] < dep[v] ? u : v);
}
void build() {
for (int i = 2; i <= m; ++i)
lg[i] = lg[i / 2] + 1;
for (int i = 1; i <= m; ++i)
rmq[0][i] = tour[i];
for (int p = 1; p <= lg[m] + 1; ++p)
for (int i = 1; i + (1 << (p-1)) <= m; ++i)
rmq[p][i] = mindep(rmq[p - 1][i], rmq[p - 1][i + (1 << (p-1))]);
}
int range(int l, int r) {
if (l > r) swap(l, r);
int k = lg[r - l + 1];
return mindep(rmq[k][l], rmq[k][r - (1 << k) + 1]);
}
int lca(int u, int v) {
if (pos[u] > pos[v])
swap(u, v);
return range(pos[u], pos[v]);
}
int main() {
fin >> n >> q;
for (int i = 2; i <= n; ++i) {
int p; fin >> p;
g[p].emplace_back(i);
g[i].emplace_back(p);
}
dfe(1, 0);
build();
while (q--) {
int u, v;
fin >> u >> v;
fout << lca(u,v) << '\n';
}
}