Pagini recente » Cod sursa (job #3365638) | Cod sursa (job #3366243) | Statistici Iordache Gabriela Alina (gabriella) | Atasamentele paginii Profil Edi_Gaman | Cod sursa (job #3366513)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,x,y;
vector<int> v[100001];
int depth[100001];
int up[100001][20];
void dfs(int nod, int tata){
up[nod][0]=tata;
for(int p=1;p<20;p++){
up[nod][p]=up[up[nod][p-1]][p-1];
}
for(auto u:v[nod]){
if(u!=tata){
depth[u]=depth[nod]+1;
dfs(u,nod);
}
}
}
int lift(int a, int nivel){
for(int i=0;i<=19;i++){
if(nivel&(1<<i)){
a=up[a][i];
}
}
return a;
}
int lca(int a, int b){
if(depth[a]<depth[b]){
swap(a,b);
}
a=lift(a,depth[a]-depth[b]);
if(a==b){
return a;
}
for(int i=19;i>=0;i--){
if(up[a][i]!=up[b][i]){
a=up[a][i];
b=up[b][i];
}
}
return up[a][0];
}
int main()
{
fin>>n>>q;
for(int i=2;i<=n;i++){
fin>>x;
v[i].push_back(x);
v[x].push_back(i);
}
depth[1]=1;
dfs(1,0);
while(q--){
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
return 0;
}