Pagini recente » Cod sursa (job #3159809) | Cod sursa (job #1883026) | Cod sursa (job #119181) | Cod sursa (job #1858941) | Cod sursa (job #1548653)
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100002
int n, m, p[21][MAXN], D[MAXN];
void pre(){
int i, j;
for(i=1; i<=20; ++i)
for(j=2; j<=n; ++j)
p[i][j]=p[i-1][p[i-1][j]];
}
int query(int a, int b){
if(D[a]<D[b]) swap(a, b);
int delta=D[a]-D[b];
for(int i=0; (1<<i)<=delta; ++i)
if((delta>>i)&1)
a=p[i][a];
if(a==b) return a;
for(int i=20; i>=0; --i)
if(p[i][a]!=p[i][b])
a=p[i][a], b=p[i][b];
return p[0][a];
}
int main ()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
int i, a, b;
for(i=1; i<n; ++i){
scanf("%d",&a);
D[i+1]=D[a]+1;
p[0][i+1]=a;
}
while(m--){
scanf("%d%d",&a,&b);
printf("%d\n",query(a, b));
}
return 0;
}