Cod sursa(job #2714965)

Utilizator NorbiNORBI KOVER Norbi Data 2 martie 2021 19:42:49
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 kb
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
FILE *f=fopen("lca.in","r");
FILE *g=fopen("lca.out","w");
long n,nrp;
struct Muchie{int x,y;}Muchii[100001];
bool Compare(Muchie a,Muchie b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
vector<pair<long,long> > euler;
long frecv[100001];
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);
        Muchii[i-1].x=j;
        Muchii[i-1].y=i;
    }
    sort(Muchii+1,Muchii+n,Compare);
}

void Back(long nodCurent,long nivel)
{
   euler.push_back(make_pair(nodCurent,nivel));
   if(frecv[nodCurent]==0)frecv[nodCurent]=euler.size()-1;

    int j=1;
    while(Muchii[j].x!=nodCurent&&j<n)j++;

    while(Muchii[j].x==nodCurent&&j<n)
    {
       long vecin = Muchii[j].y;
       Back(vecin,nivel+1);
       euler.push_back(make_pair(nodCurent,nivel));
       if(frecv[nodCurent]==0)frecv[nodCurent]=euler.size()-1;
       j++;
    }
}
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 Rez()
{
    for(long i=1;i<=nrp;i++)
    {
        long x,y;
        fscanf(f,"%ld%ld",&x,&y);
        fprintf(g,"%ld\n",FindLca(x,y));
    }
}
void Print()
{
    for(long i=1;i<n;i++)
    {
        fprintf(g,"%ld %ld\n",Muchii[i].x,Muchii[i].y);
    }
}
int main()
{
    read();
    Back(1,0);// nodCurent=1; nivel =0;
    Rez();
    //Print();
    fclose(f);
    fclose(g);
    return 0;
}