Cod sursa(job #2714949)

Utilizator NorbiNORBI KOVER Norbi Data 2 martie 2021 19:15:46
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#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(frecv[x]>frecv[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;
}