Pagini recente » Cod sursa (job #582962) | Cod sursa (job #2338055) | Cod sursa (job #2939203) | Cod sursa (job #815703) | Cod sursa (job #3004836)
#include <fstream>
#include <set>
#include <vector>
#define DIM 100010
#define MAX_LOG 18
using namespace std;
vector<int> L[DIM];
int pozSt[DIM], pozDr[DIM], k;
void dfs(int nod) {
pozSt[nod] = ++k;
for (auto vec: L[nod]) {
dfs(vec);
}
pozDr[nod] = ++k;
}
int n, m;
int stramos[MAX_LOG][DIM];
void calcStramosi() {
for (int p = 1; p < MAX_LOG; p++) {
for (int i = 1; i <= n; i++) {
stramos[p][i] = stramos[p - 1][stramos[p - 1][i]];
}
}
}
bool esteStramos(int x, int y) {
return pozSt[x] < pozSt[y] && pozDr[y] < pozDr[x];
}
int lca(int x, int y) {
if (esteStramos(x, y)) {
return x;
}
if (esteStramos(y, x)) {
return y;
}
for (int p = MAX_LOG - 1; p >= 0; p--) {
int z = stramos[p][x];
if (z != 0 && !esteStramos(z, y)) {
x = z;
}
}
return stramos[0][x];
}
int x, y;
int main() {
ifstream fin("lca.in");
ofstream fout("lca.out");
fin >> n >> m;
for (int i = 2; i <= n; i++) {
fin >> stramos[0][i];
L[stramos[0][i]].push_back(i);
}
dfs(1);
calcStramosi();
for (int i = 1; i <= m; i++) {
fin >> x >> y;
fout << lca(x, y) << "\n";
}
return 0;
}