Pagini recente » Cod sursa (job #3039293) | Cod sursa (job #2298001) | Cod sursa (job #1949778) | Cod sursa (job #2091866) | Cod sursa (job #2654893)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m,x,y,jmp[100011][100],Lev[100011];
int logN;
vector<int>v[200005];
void dfs(int nod,int lev){
Lev[nod]=Lev[lev]+1;
jmp[nod][0]=lev;
for(int i=1;i<logN;i++)
jmp[nod][i]=jmp[jmp[nod][i-1]][i-1];
for(auto it:v[nod]){
if(it==lev)continue;
dfs(it,nod);
}
}
int lca(int x,int y){
if(Lev[x]<Lev[y])
swap(x,y);
for(int k=logN;k>=0;k--)
if(Lev[x]-(1<<k)>=Lev[y])
x=jmp[x][k];
if(x==y)return x;
for(int k=logN-1;k>=0;k--)
if(jmp[x][k] && jmp[x][k] !=jmp[y][k]){
x=jmp[x][k];
y=jmp[y][k];
}
return jmp[x][0];
}
int main(){
in >>n>>m;
logN=int(log(n));
for(int i=2;i<=n;i++){
in>>jmp[i][0];
v[jmp[i][0]].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--){
in >>x>>y;
out <<lca(x,y)<<"\n";
}
return 0;
}