Pagini recente » Cod sursa (job #2757878) | Cod sursa (job #3262982) | Cod sursa (job #164188) | rar27 | Cod sursa (job #608149)
Cod sursa(job #608149)
#include <cstdio>
#include <fstream>
using namespace std;
int n,m,a[100001],x,y,i,j,p[100001][20],l[100001];
int lca(int n,int x,int y)
{
int i,aux,lg;
if(l[x]<l[y])
{
aux=x;
x=y;
y=aux;
}
for(lg=1;(1<<lg)<=l[x];++lg);
--lg;
for(i=lg;i>=0;--i)
if(l[x]-(1<<i)>=l[y])
x=p[x][i];
if(x==y)
return x;
for(i=lg;i>=0;--i)
if(p[x][i]!=-1&&p[x][i]!=p[y][i]&&p[y][i]!=-1)
x=p[x][i],y=p[y][i];
return a[x];
}
int main()
{
ifstream fin("lca.in");
freopen("lca.out","w",stdout);
fin>>n>>m;
l[1]=1;
for(i=2;i<=n;++i)
{
fin>>a[i];
l[i]=l[a[i]]+1;
}
for(i=0;i<=n;++i)
for(j=1;j<=18;++j)
p[i][j]=-1;
for(i=1;i<=n;++i)
p[i][0]=a[i];
for(j=1;j<=18;++j)
for(i=0;i<=n;++i)
if(p[i][j-1]!=-1)
p[i][j]=p[p[i][j-1]][j-1];
for(;m;--m)
{
fin>>x>>y;
printf("%d\n",lca(n,x,y));
}
return 0;
}