Pagini recente » Cod sursa (job #1843437) | Cod sursa (job #2817465) | Cod sursa (job #3192725) | Cod sursa (job #3373) | Cod sursa (job #2189420)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nmax = 100005, sqn = 315;
int n, m, x, y, i, v, tt[nmax], ttsq[nmax], niv[nmax], nivsq[nmax];
vector <int> ls[nmax];
void dfs(int x) {
int l = ls[x].size(), i, y;
niv[x] = niv[tt[x]] + 1;
if (niv[x]%sqn == 0) {
ttsq[x] = tt[x], nivsq[x] = nivsq[tt[x]]+1;
} else ttsq[x] = ttsq[ tt[x] ], nivsq[x] = nivsq[ tt[x] ];
for (i = 0; i < l; i++) {
y = ls[x][i];
dfs(y);
}
}
int lca(int x, int y) {
while (ttsq[x] != ttsq[y]) {
if (nivsq[x] > nivsq[y]) x = ttsq[x];
else y = ttsq[y];
}
while (x != y) {
if (niv[x] > niv[y]) x = tt[x];
else y = tt[y];
}
return x;
}
int main() {
f >> n >> m;
for (i = 2; i <= n; i++) {
f >> x;
tt[i] = x;
ls[x].push_back(i);
}
niv[1] = 1;
dfs(1);
while (m--) {
f >> x >> y;
g << lca(x, y) << '\n';
}
return 0;
}