Pagini recente » Cod sursa (job #501305) | Cod sursa (job #1481976) | Cod sursa (job #2627204) | Cod sursa (job #990254) | Cod sursa (job #1162907)
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int dim=100000;
struct nod
{
int x;
queue <nod *>f;
}*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;
scanf("%d%d",&n,&m);
a[1]=new nod;
a[1]->x=1;
for(int i=2;i<=n;++i)
{
scanf("%d",&x);
a[i]=new nod;
a[i]->x=i;
a[x]->f.push(a[i]);
}
}
void eulerf(nod *nd,int adancime)
{
eulerv[++e]=nd->x;
ad[e]=adancime;
poz[nd->x]=e;
while(!nd->f.empty())
{
eulerf(nd->f.front(),adancime+1);
eulerv[++e]=nd->x;
ad[e]=adancime;
nd->f.pop();
}
}
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(a[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;
}