Pagini recente » Cod sursa (job #3346554) | Cod sursa (job #1102181) | Cod sursa (job #201138) | Cod sursa (job #960146) | Cod sursa (job #3324554)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int NMAX = 100005;
const int LGMAX = 18;
vector<int> v[NMAX], roots;
int anc[NMAX][LGMAX];
int in[NMAX], out[NMAX];
int timp, n;
void dfs(int nod, int t) {
anc[nod][0] = t;
for (int j = 1; j < LGMAX; j++) {
anc[nod][j] = anc[anc[nod][j - 1]][j - 1];
}
in[nod] = ++timp;
for (auto i: v[nod]) {
dfs(i, nod);
}
out[nod] = timp;
}
int solve(int nod, int k) {
for (int i = 0; (1 << i) <= k; i++) {
if (k & (1 << i)) {
nod = anc[nod][i];
}
}
return nod;
}
bool esteStramos(int a, int b) {
if (a == 0) {
return true;
}
return in[a] <= in[b] && out[b] <= out[a];
}
int lca(int a, int b) {
int st = 0, dr = n, ans = n;
while (st <= dr) {
int m = (st + dr) / 2;
if (esteStramos(solve(a, m), b)) {
ans = m;
dr = m - 1;
} else {
st = m + 1;
}
}
return solve(a, ans);
}
int main() {
int q;
cin >> n >> q;
for (int i = 2; i <= n; i++) {
int a; cin >> a;
v[a].push_back(i);
}
dfs(1, 0);
for (int i = 1; i <= q; i++) {
int a, b; cin >> a >> b;
cout << lca(a, b) << '\n';
}
return 0;
}