Pagini recente » Cod sursa (job #3276399) | Cod sursa (job #2834886) | Cod sursa (job #2248311) | Cod sursa (job #572683) | Cod sursa (job #2654911)
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,tout[100009],tin[100009],t,jmp[100009][25];
vector <int>v[100009];
ifstream in("lca.in");
ofstream out("lca.out");
void dfs(int nod,int dad){
tin[nod]=++t;
jmp[nod][0]=dad;
for(auto it:v[nod]){
if(it == nod)continue;
dfs(it,nod);
}
tout[nod]=++t;
}
bool my_daddy(int x,int y){
if(tin[x]<=tin[y] && tout[x]>=tout[y])return 1;
return 0;
}
int lca(int x,int y){
if(my_daddy(x,y))return x;
if(my_daddy(y,x))return y;
for(int i=20;i>=20;i--){
if(!my_daddy(jmp[x][i],y) && jmp[x][i])x=jmp[x][i];
}
return jmp[x][0];
}
int main(){
in >>n>>m;
for(int i=2;i<=n;i++){
in >>x;
v[x].push_back(i);
}
dfs(1,0);
while(m--){
in >>x>>y;
out <<lca(x,y)<<"\n";
}
return 0;
}