Pagini recente » Cod sursa (job #168344) | Cod sursa (job #2227239) | Cod sursa (job #688082) | Cod sursa (job #1786640) | Cod sursa (job #1140856)
#include<cstdio>
#include<vector>
using namespace std;
const int N=100000;
vector<int>sons[N];
int r[18][N+1];
int e[2*N+1],nivel[N+1],first[N+1],eNivel[2*N+1],log[2*N+1];
int n,m,eL;
void citire(){
int i,scan;
scanf("%d%d",&n,&m);
for(i=1;i<n;i++){
scanf("%d",&scan);
sons[scan].push_back(i+1);
}
}
void init(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
citire();
}
void dFS(int x){
int i;
e[++eL]=x;
eNivel[eL]=nivel[x];
first[x]=eL;
for(i=0;i<sons[x].size();i++){
nivel[sons[x][i]]=nivel[x]+1;
dFS(sons[x][i]);
e[++eL]=x;
eNivel[eL]=nivel[x];
}
}
int min2(int x, int y){
if (x<y)
x=y;
return x;
}
void setR(){
int i,j,l;
for(i=2;i<=eL;i++)
log[i]=log[i/2]+1;
for(i=1;i<=eL;i++)
r[0][i]=eNivel[i];
for (i=1;(1<<i)<=n;i++)
for(j=1;j<=n-(1<<i)+1;j++){
l=1<<(i-1);
r[i][j]=min2(r[i-1][j],r[i-1][j+l]);
}
}
int rMQ(int x,int y){
int l,diff,sh;
x=first[x];
y=first[y];
diff=y-x+1;
l=log[diff];
sh=diff-(1<<l);
return min2(r[l][x],r[l][x+sh]);
}
int main(){
int i,x,y;
init();
dFS(1);
setR();
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",rMQ(x,y));
}
return 0;
}