Pagini recente » Cod sursa (job #2054825) | Cod sursa (job #1698732) | Cod sursa (job #374649) | Cod sursa (job #1572171) | Cod sursa (job #1584548)
#include <fstream>
#include <cmath>
#include <iostream>
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 nmin[3501][3501];
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,lca;
fin>>n>>m;
for(i=2;i<=n;i++) {fin>>x; Add(prim[x],i);}
Euler(1,1);
for (i=1; i<=k; i++)
{
nmin[i][i]=i;
for (j=i+1; j<=k; j++)
{
if (nivel[nmin[i][j-1]]<nivel[j])
nmin[i][j]=nmin[i][j-1];
else nmin[i][j]=j;
}
}
cout << sizeof (nmin)/1024.0/1024.0;
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;}
/*for(j=px;j<=py;j++)
if(nivel[j]<min) {min=nivel[j];lca=euler[j];}*/
lca=euler[nmin[px][py]];
fout<<lca<<"\n";
}
return 0;
}