Pagini recente » Cod sursa (job #948528) | Cod sursa (job #105174) | Cod sursa (job #2061576) | Cod sursa (job #743268) | Cod sursa (job #1769171)
#include <cstdio>
#include <vector>
using namespace std;
const int N=100005;
int d[N][20],l[N];
vector <int> G[N];
void dfs(int x){
for(int i=0;i<(int)G[x].size();i++){
int y=G[x][i];
l[y]=l[x]+1;
dfs(y);
}
}
int lca(int x, int y){
if(l[x]<l[y]) swap(x,y);
int z=l[x]-l[y];
for(int j=0;j<=17;j++)
if((z&(1<<j))>0) x=d[x][j];
if(x==y) return x;
for(int j=17;j>=0;j--)
if(d[x][j]!=d[y][j]){
x=d[x][j];
y=d[y][j];
}
return d[x][0];
}
int main(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int n,m,x,i,j,a,b;
scanf("%d%d",&n,&m);
for(i=2;i<=n;i++){
scanf("%d",&a);
G[a].push_back(i);
d[i][0]=a;
}
dfs(1);
for(j=1;j<=17;j++)
for(i=1;i<=n;i++)
d[i][j]=d[d[i][j-1]][j-1];
for(i=1;i<=m;i++){
scanf("%d%d",&a,&b);
x=lca(a,b);
printf("%d\n",x);
}
return 0;
}