Pagini recente » Cod sursa (job #268702) | Cod sursa (job #2578092) | Cod sursa (job #2739619)
#include <fstream>
#include <vector>
using namespace std;
const int nxM = 400001;
int table[25][nxM];
int lg[nxM];
int new_ind[nxM], cnt = 0;
int eul[nxM], l = 0;
int first_encounter[nxM];
int old_ind[nxM];
vector<int> a[nxM];
void dfs(int x, int px) {
int i;
new_ind[x] = ++cnt;
old_ind[cnt] = x;
eul[++l] = new_ind[x];
first_encounter[x] = l;
for (i = 0; i < a[x].size(); i++) {
if (a[x][i] == px) continue;
dfs(a[x][i], x);
eul[++l] = new_ind[x];
}
}
int main() {
ifstream f("lca.in");
int n, m, i, j, x, aux, y, r, Min;
f >> n >> m;
for (i = 2; i <= n; i++) {
f >> x;
a[x].emplace_back(i);
a[i].emplace_back(x);
}
dfs(1, 0);
//preprocess
for (i = 2; i <= l; i++)
lg[i] = lg[i / 2] + 1;
for (i = 1; i <= l; i++)
table[0][i] = eul[i];
for (i = 1; i <= lg[l]; i++)
for (j = 1; j + (1 << i) - 1 <= l; j++) {
aux = (1 << (i - 1));
table[i][j] = min(table[i - 1][j], table[i - 1][j + aux]);
}
ofstream g("lca.out");
for (i = 1; i <= m; i++) {
f >> x >> y;
x = first_encounter[x];
y = first_encounter[y];
if (x > y)
swap(x, y);
r = lg[y - x + 1];
g << old_ind[min(table[r][x], table[r][y - (1 << r) + 1])] << '\n';
}
f.close();
g.close();
return 0;
}