Pagini recente » Cod sursa (job #243411) | Cod sursa (job #2625836) | Cod sursa (job #1002660) | Cod sursa (job #1093534) | Cod sursa (job #2714925)
#include <cstdio>
#include<vector>
using namespace std;
FILE *f=fopen("lca.in","r");
FILE *g=fopen("lca.out","w");
long n,nrp;
vector<long>Muchii[100001];
//vector<pair<long,long> > euler;
struct {long nod,nivel;}euler[2000001];
long nrEuler;
void read()
{
fscanf(f,"%ld%ld",&n,&nrp);
for(long i=2;i<=n;i++)
{
long j;fscanf(f,"%ld",&j);
Muchii[j].push_back(i);
}
}
void Back(long nodCurent,long nivel)
{
//euler.push_back(make_pair(nodCurent,nivel));
euler[++nrEuler].nod=nodCurent;
euler[nrEuler].nivel=nivel;
for(long j=0;j<Muchii[nodCurent].size();j++)
{
long vecin = Muchii[nodCurent][j];
Back(vecin,nivel+1);
//euler.push_back(make_pair(nodCurent,nivel));
euler[++nrEuler].nod=nodCurent;
euler[nrEuler].nivel=nivel;
}
}
void Print()
{
for(long i=1;i<=nrEuler;i++)
printf("%ld %ld\n",euler[i].nod,euler[i].nivel);
}
long FindLca(long x,long y)
{
if(x>y)
{
long aux =x;
x=y;
y=aux;
}
for(long i=1;i<=nrEuler;i++)
{
if(euler[i].nod==x)
{
long j=i;long minNivel=(1<<30);long tataComun;
while(euler[j].nod!=y&&j<=nrEuler)
{
if(euler[j].nivel<minNivel)
{
minNivel=euler[j].nivel;
tataComun=euler[j].nod;
}
j++;
}
if(j<=nrEuler)
{
return tataComun;
}
}
}
}
void Rez()
{
for(long i=1;i<=nrp;i++)
{
long x,y;
fscanf(f,"%ld%ld",&x,&y);
fprintf(g,"%ld\n",FindLca(x,y));
}
}
int main()
{
read();
Back(1,0);
//Print();
Rez();
for(long i=1;i<=n;i++)
Muchii[i].clear();
fclose(f);
fclose(g);
return 0;
}