Pagini recente » Cod sursa (job #2773144) | Cod sursa (job #849605) | Cod sursa (job #1357307) | Cod sursa (job #349038) | Cod sursa (job #3231288)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5 + 69;
int bl[20][NMAX];
int dep[NMAX];
int n, m;
int query(int u, int k){
int r = u;
for(int i = 0; i < 20; i++){
if(k & (1 << i)) r = bl[i][r];
}
return r;
}
int depth(int u){
return dep[u] ? dep[u] : dep[u] = depth(bl[0][u]) + 1;
}
int main(){
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
dep[1] = 1;
bl[0][1] = 1;
cin >> n >> m;
for(int i = 2; i <= n; i++){
cin >> bl[0][i];
}
for(int j = 1; j < 20; j++){
for(int i = 1; i <= n; i++){
bl[j][i] = bl[j-1][bl[j-1][i]];
}
}
while(m--){
int u, v, i, d1, d2;
cin >> u >> v;
d1 = depth(u);
d2 = depth(v);
if(d1 > d2){
u = query(u, d1 - d2);
}else{
u = query(u, d2 - d1);
}
int st = 0, dr = depth(u) - 1, mij;
while(st < dr){
mij = (st + dr) / 2;
if(query(u, mij) == query(v, mij)){
dr = mij;
}else{
st = mij + 1;
}
}
cout << query(u, st) << '\n';
}
return 0;
}