Pagini recente » Cod sursa (job #152274) | Cod sursa (job #849831) | Cod sursa (job #1736644) | Cod sursa (job #2743329) | Cod sursa (job #1744874)
#include<fstream>
#include<stdlib.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,j,nr,ap[100005],val,a,b,log[200010],minim[20][200010],mins,maxs,l;
struct nod{
int inf;
nod *urm;
}*L[100005];
struct euler{
int nod,nivel;
}coada[200010];
void adaugsf(nod *&vf,int val){
nod *q;
q=new nod;
q->inf=val;
q->urm=vf;
vf=q;
}
void cit(){
fin>>n>>m;
for (i=1;i<=n;i++)
L[i]=0;
for (i=2;i<=n;i++){
fin>>val;
adaugsf(L[val],i);
}
}
void DFS(int k,int niv){
nod *q;
nr++;
coada[nr].nivel=niv;
coada[nr].nod=k;
ap[k]=nr;
q=L[k];
while(q!=0){
DFS(q->inf,niv+1);
nr++;
coada[nr].nivel=niv;
coada[nr].nod=k;
q=q->urm;
}
}
int main(){
cit();
DFS(1,0);
log[1]=0;
for (i=2;i<=nr;i++){
log[i]=log[i/2]+1;
minim[0][i]=i;
}
for (j=1;(1<<j)<=nr;j++){
i=1;l=1<<(j-1);
while(i+2*l<=nr){
if (coada[minim[j-1][i]].nivel<coada[minim[j-1][i+l]].nivel) minim[j][i]=minim[j-1][i];
else
minim[j][i]=minim[j-1][i+l];
i++;
}
}
for (i=1;i<=m;i++){
fin>>a>>b;
if (ap[a]<ap[b]){
mins=ap[a];
maxs=ap[b];
}
else
{
maxs=ap[a];
mins=ap[b];
}
val=log[maxs-mins+1];l=1<<val;
if (coada[minim[val][mins]].nivel<coada[minim[val][maxs-l+1]].nivel) fout<<coada[minim[val][mins]].nod<<'\n';
else
fout<<coada[minim[val][maxs-l+1]].nod<<'\n';
}
fin.close();
fout.close();
return 0;
}