Pagini recente » Cod sursa (job #2547181) | Cod sursa (job #1109595) | Cod sursa (job #932981) | Cod sursa (job #950062) | Cod sursa (job #1162911)
#include <cstdio>
#include <algorithm>
using namespace std;
const int dim=100000;
struct nod
{
int x;
nod *u;
}*a[dim+1];
int n,m,e,poz[dim+1],eulerv[2*dim],ad[2*dim]; //prb+euler
int lg[2*dim],rmq[2*dim][18]; //rmq
void read()
{
freopen("lca.in","r",stdin);
int x;
nod *nd;
scanf("%d%d",&n,&m);
for(int i=2;i<=n;++i)
{
scanf("%d",&x);
nd=new nod;
nd->x=i;
nd->u=a[x];
a[x]=nd;
}
}
void eulerf(int x,int adancime)
{
eulerv[++e]=x;
ad[e]=adancime;
poz[x]=e;
while(a[x])
{
eulerf(a[x]->x,adancime+1);
eulerv[++e]=x;
ad[e]=adancime;
a[x]=a[x]->u;
}
}
void rmqf()
{
int i,k;
for(i=2;i<=e;++i)
{
lg[i]=lg[i>>1]+1;
}
for(i=1;i<=e;++i)
{
rmq[i][0]=i;
}
for(k=1;(1<<k)<=e;++k)
{
for(i=1;i<=e-(1<<k)+1;++i)
{
if(ad[rmq[i][k-1]]<ad[rmq[i+(1<<(k-1))][k-1]])
{
rmq[i][k]=rmq[i][k-1];
}
else
{
rmq[i][k]=rmq[i+(1<<(k-1))][k-1];
}
}
}
}
int main()
{
read();
eulerf(1,0);
freopen("lca.out","w",stdout);
rmqf();
int x,y,diff;
while(m)
{
--m;
scanf("%d%d",&x,&y);
x=poz[x];
y=poz[y];
if(x>y)
{
diff=lg[x-y+1];
if(ad[rmq[y][diff]]<ad[rmq[x+1-(1<<diff)][diff]])
{
printf("%d\n",eulerv[rmq[y][diff]]);
}
else
{
printf("%d\n",eulerv[rmq[x+1-(1<<diff)][diff]]);
}
}
else
{
diff=lg[y-x+1];
if(ad[rmq[x][diff]]<ad[rmq[y+1-(1<<diff)][diff]])
{
printf("%d\n",eulerv[rmq[x][diff]]);
}
else
{
printf("%d\n",eulerv[rmq[y+1-(1<<diff)][diff]]);
}
}
}
return 0;
}