Pagini recente » Cod sursa (job #3229317) | Cod sursa (job #3000555) | Cod sursa (job #99770) | Cod sursa (job #2882582) | Cod sursa (job #2777737)
#include <fstream>
#include <cmath>
std::ifstream fin ("lca.in");
std::ofstream fout ("lca.out");
int const nmax = 250000;
int const pmax = 19;
int stramosi[pmax][nmax];
int level[nmax];
int n, m;
void build_stramosi () {
int plim = log2(n);
for (int p = 1; p <= plim; p++)
for (int i = 1; i <= n; i++)
stramosi[p][i] = stramosi[p - 1][stramosi[p - 1][i]];
}
void equilibrate (int& small, int& big) {
int lim = log2(n);
for (; lim >= 0; lim--) {
if (level[stramosi[lim][small]] > level[big])
small = stramosi[lim][small];
}
small = stramosi[0][small];
}
int main () {
fin >> n >> m;
for (int i = 2; i <= n; i++) {
fin >> stramosi[0][i];
level[i] = level[stramosi[0][i]] + 1;
}
build_stramosi();
for (int i = m; i; i--) {
int x, y;
fin >> x >> y;
if (level[x] > level[y])
equilibrate (x, y);
else if (level[x] < level[y])
equilibrate (y, x);
if (x == y) {
fout << x << "\n";
continue;
}
int plim = log2(n); int val = (1 << plim);
for (; val; val >>= 1, plim--) {
if (stramosi[plim][x] != stramosi[plim][y]) {
x = stramosi[plim][x];
y = stramosi[plim][y];
}
}
fout << stramosi[0][x] << "\n";
}
}