Pagini recente » Cod sursa (job #997638) | Cod sursa (job #800765) | Cod sursa (job #261876) | Cod sursa (job #2266635) | Cod sursa (job #2368413)
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
struct nod{
int inf;
nod *urm;
}*l[100005];
int a,b,k,rmq[100005][20];
int x,n,q,h[100005],use[100005];
void adaug(nod *&p,int x){
nod *u;
u=new nod;
u->inf=x;
u->urm=p;
p=u;
return;
}
int kk,st[1000005];
void df(int x,int height){
nod *p;
use[x]=1;
h[++kk]=height;
st[kk]=x;
for(p=l[x];p;p=p->urm)
if(!use[p->inf]){ df(p->inf,height+1);
st[++kk]=x;
h[kk]=height;}
}
int j;
int main()
{ freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int i;
scanf("%d%d",&n,&q);
for(i=2;i<=n;i++) {
scanf("%d",&x);
adaug(l[x],i);
adaug(l[i],x);
}
df(1,0);
n=kk;
for(i=1;i<=n;i++) rmq[i][0]=i;
for(j=1;(1<<j)<=n;j++)
for(i=1;i<=n-(1<<j)+1;i++){
if(h[rmq[i][j-1]]<h[rmq[i+(1<<(j-1))][j-1]]) rmq[i][j]=rmq[i][j-1];
else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
for(k=1;k<=q;k++){
scanf("%d%d",&a,&b);
int log=(int)(log2(b-a+1));
printf("%d\n",min(h[rmq[a][log]],h[rmq[b-(1<<log)+1][log]])+1);
}
return 0;
}