Pagini recente » Cod sursa (job #2712058) | Cod sursa (job #3213649) | Cod sursa (job #1068833) | Cod sursa (job #1203076) | Cod sursa (job #1069362)
#include <stdio.h>
#include<vector>
#define pb push_back
#include <math.h>
using namespace std;
const int nmax = 100000;
vector < int > a[nmax];
int n,m,T[nmax],P[nmax],L[nmax],h=0,nr;
void dfs(int nod){
if(nod<nr)
P[nod]=1;
else if(!(nod%nr))
P[nod] = T[nod];
else
P[nod]=P[T[nod]];
for(int i=0;i<a[nod].size();i++)
dfs(a[nod][i]);
}
int lca(int x,int y){
while(P[x]!=P[y])
if(L[x]>L[y])
x=T[x];
else y=T[y];
while(x!=y)
if(L[x]>L[y])x=T[x];
else y=T[y];
return x;
}
int main(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%ld%ld",&n,&m);
int x,y;
P[1]=1;
T[1]=1;
L[1]=0;
for(int i=2;i<=n;i++){
scanf("%d",&T[i]);
L[i] = L[T[i]]+1;
if(L[i]>h)h=L[i];
a[T[i]].pb(i);
}
nr = trunc(sqrt(h));
dfs(1);
//for(int i=1;i<=n;i++) printf("%d ",L[i]);
//printf("%d\n",lca(2,3));
//for(int i=1;i<=n;i++) printf("%d ",P[i]);
for(int i=1;i<=m;i++){
scanf("%d %d",&x,&y);
printf("%d\n",lca(x,y));
}
fclose(stdout); fclose(stdin);
return 0;
}