Pagini recente » Cod sursa (job #1900718) | Cod sursa (job #1011350) | Cod sursa (job #1235044) | Cod sursa (job #2442799) | Cod sursa (job #2292709)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 100010;
vector <int> adia[NMAX + 10];
int h[NMAX + 10];
int link[NMAX + 10], lant[NMAX + 10], cnt;
int g[NMAX + 10];
vector <pair <int, int>> not_used;
void dfs(int nod, int t)
{
g[nod] = 1;
h[nod] = 1 + h[t];
int best_fiu = 0;
for (auto i : adia[nod]) {
dfs(i, nod);
g[nod] += g[i];
if (g[i] > g[best_fiu])
best_fiu = i;
}
if (best_fiu)
lant[nod] = lant[best_fiu], link[lant[nod]] = t;
else
lant[nod] = ++cnt, link[lant[nod]] = t;
}
int lca(int a, int b)
{
while (1) {
if (lant[a] == lant[b])
return (h[a] < h[b] ? a : b);
if (h[link[lant[a]]] > h[link[lant[b]]])
a = link[lant[a]];
else
b = link[lant[b]];
}
}
int main()
{
FILE *in = fopen("lca.in", "r");
FILE *out = fopen("lca.out", "w");
int n, m, t;
fscanf(in, "%d%d", &n, &m);
for (int i = 2; i <= n; i++) {
fscanf(in, "%d", &t);
adia[t].push_back(i);
}
dfs(1, 0);
while (m--) {
int a, b;
fscanf(in, "%d%d", &a, &b);
fprintf(out, "%d\n", lca(a, b));
}
return 0;
}