Pagini recente » Cod sursa (job #2827598) | Cod sursa (job #2958067) | Cod sursa (job #1739806) | Cod sursa (job #629753) | Cod sursa (job #3231303)
#include <bits/stdc++.h>
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")
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{
v = query(v, d2 - d1);
}
if(u == v){
cout << u << '\n';
continue;
}
for(i = 19; i >= 0; i--){
if(bl[i][u] != bl[i][v]){
u = bl[i][u];
v = bl[i][v];
}
}
cout << bl[0][u] << '\n';
}
return 0;
}