Pagini recente » Cod sursa (job #102115) | Borderou de evaluare (job #1551154) | Cod sursa (job #2728839) | Cod sursa (job #2396365) | Cod sursa (job #2654645)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,m,x,y,jmp[100005][50],Lev[100005];
vector<int>v[100005];
int dfs(int nod,int lev){
Lev[nod]=Lev[lev]+1;
jmp[nod][0]=lev;
for(int i=1;i<log(n);i++)
jmp[nod][i]=jmp[jmp[nod][i-1]][i-1];
for(int i=0;i<v[nod].size();i++){
int s=v[nod][i];
if(s==lev)continue;
dfs(s,nod);
}
}
int lca(int x,int y){
if(Lev[x]<Lev[y])
swap(x,y);
int diff=Lev[x]-Lev[y];
for(int k=20;k>=0;k--)
if(diff>=(1<<k)){
x=jmp[x][k];
diff-=1<<k;
}
if(x==y)return x;
for(int k=20;k>=0;k--){
int x1,y1;
x1=jmp[x][k];
y1=jmp[y][k];
if(x1 !=y1){
x=x1;y=y1;
}
}
return jmp[x][0];
}
int main(){
cin >>n>>m;
for(int i=2;i<=n;i++){
cin>>jmp[0][i];
v[jmp[0][i]].push_back(i);
}
dfs(1,0);
for(int i=1;i<=n;i++)
for(int k=1;(1<<k)<=n;k++)
jmp[i][k]=jmp[jmp[i][k-1]][k-1];
while(m--){
cin >>x>>y;
cout <<lca(x,y)<<"\n";
}
return 0;
}