Pagini recente » Cod sursa (job #3245869) | Cod sursa (job #22730) | Cod sursa (job #1378099) | Cod sursa (job #1595881) | Cod sursa (job #1584302)
#include <fstream>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct nod
{ int info;
nod* urm;
};
nod * prim[100001];
int euler[200001];
int nivel[200001];
int first[100001];
int n,m,k;
inline void Add(nod*&prim,int x)
{ nod*p=new nod;
p->info=x;
p->urm=prim;
prim=p;
}
void Euler(int x, int niv)
{ euler[++k]=x;
nivel[k]=niv;
if(first[x]==0) first[x]=k;
for(nod* p=prim[x];p!=NULL;p=p->urm)
{ Euler(p->info,niv+1);
euler[++k]=x;
nivel[k]=niv;
}
}
int main()
{ int i,j,x,y,px,py,min,lca;
fin>>n>>m;
for(i=2;i<=n;i++) {fin>>x; Add(prim[x],i);}
Euler(1,1);
for(i=1;i<=m;i++)
{ fin>>x>>y;
px=first[x];py=first[y];
if(px>py) {int aux=px; px=py;py=aux;}
min=n+1;
for(j=px;j<=py;j++)
if(nivel[j]<min) {min=nivel[j];lca=euler[j];}
fout<<lca<<"\n";
}
return 0;
}