Pagini recente » Cod sursa (job #46429) | Clasament autumn2007-runda2 | Cod sursa (job #1458562) | Cod sursa (job #1147206) | Cod sursa (job #2714947)
#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[10001];
vector<pair<long,long> > euler;
long frecv[10001];
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));
if(frecv[nodCurent]==0)frecv[nodCurent]=euler.size()-1;
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));
if(frecv[nodCurent]==0)frecv[nodCurent]=euler.size()-1;
}
}
long FindLca(long x,long y)
{
if(x>y)
{
long aux =x;
x=y;
y=aux;
}
long i=frecv[x];
if(euler[i].first==x)
{
long j=i;long minNivel=(1<<30);long tataComun;
while(euler[j].first!=y&&j<euler.size())
{
if(euler[j].second<minNivel)
{
minNivel=euler[j].second;
tataComun=euler[j].first;
}
if(tataComun==1)break;
j++;
}
if(j<euler.size())
{
if(euler[j].second<minNivel)
{
minNivel=euler[j].second;
tataComun=euler[j].first;
}
return tataComun;
}
}
}
void Print()
{
for(long i=0;i<euler.size();i++)
{
fprintf(g,"%ld %ld\n",euler[i].first,euler[i].second);
}
}
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);
Rez();
//Print();
fclose(f);
fclose(g);
return 0;
}