Pagini recente » Cod sursa (job #110706) | Cod sursa (job #1717446) | Cod sursa (job #2538250) | Cod sursa (job #1267858) | Cod sursa (job #2654932)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N=(1<<5)+11;
int n,m,jmp[N][50],tin[N],tout[N],t;
vector <int> v[N];
dfs(int nod,int dadd){
tin[nod]= ++t;
jmp[nod][0]= dadd;
for(auto it: v[nod]){
if(it == dadd)continue;
dfs(it,nod);
}
tout[nod]= ++t;
}
bool my_dad(int dadd,int x){
if(tin[dadd]<=tin[x] && tout[x] <= tout[dadd])return 1;
return 0;
}
int lca(int x,int y){
if(my_dad(x,y))return x;
if(my_dad(y,x))return y;
for(int i = 20; i >= 0;i--){
if(!my_dad(jmp[x][i],y) &&jmp[x][i])x=jmp[x][i];
}
return jmp[x][0];
}
int main(){
in >>n>>m;
for(int i=2,x;i<=n;i++){
in >>x;
v[x].push_back(i);
}
dfs(1,0);
for(int j=1;j<=25;j++){
for(int i=1;i<=n;i++){
jmp[i][j]=jmp[jmp[i][j-1]][j-1];
}
}
for(int jj=1,x,y;jj<=m;jj++){
in >>x>>y;
out <<lca(x,y)<<'\n';
}
return 0;
}