Pagini recente » Cod sursa (job #2495083) | Cod sursa (job #1520812) | Cod sursa (job #2578240) | Cod sursa (job #2747262) | Cod sursa (job #1201960)
#include <fstream>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
typedef struct celula {
long nod;
celula *next;
}*lista;
lista lda[100005];
long viz[100005],i,n,m,a,b,nr,sol(0),E[100013],H[100013],poz[100013],RMQ[20][100013],minpos[20][100013],j,k,aux;
void add(long val, lista &p)
{
lista r= new celula;
r->nod=val;
r->next=p;
p=r;
}
void dfs (long nod,long &sol)
{
viz[nod]=1;
lista r=lda[nod];
while (r){
E[++sol]=nod;
H[r->nod]=H[nod]+1;
if (viz[r->nod]==0) dfs(r->nod,sol);
r=r->next;
}
E[++sol]=nod;
poz[nod]=sol;
}
int main()
{
cin>>n>>m;
for (i=1;i<n;++i) {
cin>>a;
add(i+1,lda[a]);
}
H[1]=1;
dfs(1,sol);
for (i=1;i<=sol;++i){
RMQ[0][i]=H[E[i]];
minpos[0][i]=i;
}
for (i=1;(1<<i)<=sol;++i)
for (j=1;j+(1<<i)-1<=sol;++j) {
RMQ[i][j]=min(RMQ[i-1][j],RMQ[i-1][j+(1<<(i-1))]);
if(RMQ[i][j]==RMQ[i-1][j]) minpos[i][j]=minpos[i-1][j];
else minpos[i][j]=minpos[i-1][j+(1<<(i-1))];
}
for (i=1,k=0;i<=m;++i,k=0){
cin>>a>>b;
a=poz[a]; b=poz[b];
if (a>b) swap(a,b);
if (a==b) cout<<RMQ[0][a]<<"\n";
else {
for (aux=1; aux<=(b-a); aux*=2,++k); --k;
if (min(RMQ[k][a],RMQ[k][b+1-(1<<k)])==RMQ[k][a]) cout<<E[minpos[k][a]]<<"\n";
else cout<<E[minpos[k][b+1-(1<<k)]]<<"\n";
}
}
return 0;
}