Pagini recente » Cod sursa (job #3151553) | Cod sursa (job #2226595) | Cod sursa (job #542675) | Cod sursa (job #2298690) | Cod sursa (job #3285352)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n;
vector<vector<int>> rmq(100001,vector<int>(20,0)),tabel;
vector<int>h;
void dfs(int nod,int pr) {
if(pr!=0) {
h[nod] = h[pr]+1;
}
rmq[nod][0] = pr;
for(auto i : tabel[nod]) {
if(i != pr)
dfs(i,nod);
}
}
void build() {
dfs(1,0);
for(int i=1; i<=18; i++) {
for(int j=1; j<=n; j++) {
if(rmq[j][i-1] != 0)
rmq[j][i] = rmq[rmq[j][i-1]][i-1];
else rmq[j][i] = 0;
}
}
}
int query(int a,int b) {
///aducem pe a -> b
if(h[a] < h[b])
swap(a,b);
int k = h[a] - h[b];
for(int i=18; i>=0; i--) {
if(k & (1<<i)) {
a = rmq[a][i];
}
}
if(a==b) {
return b;
}
for(int i=18; i>=0; i--) {
if(rmq[a][i] != rmq[b][i]) {
a = rmq[a][i];
b = rmq[b][i];
}
}
return rmq[a][0];
}
int main() {
int q;
fin>>n>>q;
tabel.resize(n+1);
h.resize(n+1,0);
for(int i=2; i<=n; i++) {
int pr;
fin>>pr;
tabel[i].push_back(pr);
tabel[pr].push_back(i);
}
build();
while(q--) {
int a,b;
fin>>a>>b;
fout<<query(a,b)<<"\n";
}
return 0;
}