Pagini recente » Cod sursa (job #1046897) | Cod sursa (job #2429933) | Cod sursa (job #1480657) | Cod sursa (job #240725) | Cod sursa (job #3338447)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define NMAX 100000
#define LOG2 17
vector <int> arb[NMAX + 1];
int salt[LOG2 + 1][NMAX + 1];
int lg[NMAX + 1];
int l[NMAX + 1];
int r[NMAX + 1];
int t = 0;
void set_logs(){
lg[0] = lg[1] = 0;
for (int i = 2; i <= NMAX; i++){
lg[i] = lg[i / 2] + 1;
}
}
void dfs(int node){
t++;
l[node] = t;
for (auto neighbour : arb[node]){
dfs(neighbour);
}
t++;
r[node] = t;
}
void binary_lifting(int N){
for (int p = 1; p <= lg[N]; p++){
for (int i = 2; i <= N; i++){
salt[p][i] = salt[p - 1][salt[p - 1][i]];
}
}
}
int e_stramos(int a, int b){
return l[a] <= l[b] && r[b] <= r[a];
}
int lca(int a, int b, int N){
if (e_stramos(a, b)){
return a;
}
if (e_stramos(b, a)){
return b;
}
for (int pas = lg[N]; pas >= 0; pas--){
if (e_stramos(salt[pas][a], b) == 0 && salt[pas][a] != 0){
a = salt[pas][a];
}
}
return salt[0][a];
}
int main()
{
set_logs();
int N, Q;
fin >> N >> Q;
for (int i = 1; i < N; i++){
int x;
fin >> x;
arb[x].push_back(i + 1);
salt[0][i + 1] = x;
}
salt[0][1] = 1;
dfs(1);
binary_lifting(N);
for (int i = 1; i <= Q; i++){
int a, b;
fin >> a >> b;
fout << lca(a, b, N) << '\n';
}
return 0;
}