Pagini recente » Cod sursa (job #2171800) | Cod sursa (job #250139) | Cod sursa (job #2809603) | Cod sursa (job #1965277) | Cod sursa (job #3198194)
#include <bits/stdc++.h>
using namespace std;
const int dim=1e5+5;
int n,q,t[dim],d[dim],bl[20][dim];
bool viz[dim];
vector<int> G[dim];
void bfs(int nod){
viz[nod]=1;
queue<int> Q;
Q.push(nod);
while(!Q.empty()){
int x=Q.front();
Q.pop();
for(auto u:G[x]){
if(!viz[u]){
viz[u]=1;
d[u]=d[x]+1;
Q.push(u);
}
}
}
}
void bin_lif(){
for(int i=1;i<=n;i++){
bl[0][i]=t[i];
}
for(int k=1;k<20;k++){
for(int i=1;i<=n;i++){
bl[k][i]=bl[k-1][bl[k-1][i]];
}
}
}
int lca(int x, int y){
if(d[x]<d[y]){
swap(x,y);
}
for(int k=19;k>=0;k--){
if(d[x]-(1<<k)>=d[y]){
x=bl[k][x];
}
}
if(x==y){
return x;
}
for(int k=19;k>=0;k--){
if(bl[k][x] and bl[k][y] and bl[k][x]!=bl[k][y]){
x=bl[k][x];
y=bl[k][y];
}
}
return t[x];
}
int main(){
ifstream f("lca.in");
ofstream g("lca.out");
f>>n>>q;
for(int i=1;i<n;i++){
int x;
f>>x;
t[i+1]=x;
G[i+1].push_back(x);
G[x].push_back(i+1);
}
bfs(1);
bin_lif();
while(q--){
int x,y;
f>>x>>y;
g<<lca(x,y)<<'\n';
}
return 0;
}