Cod sursa(job #2867306)

Utilizator Andreir555Mihaila Andrei Andreir555 Data 10 martie 2022 11:56:31
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int n, m, Tata[100001];
queue <int> Solutie;

int echivalareGrad(int nod, int contorA, int contorB)
{
    while(contorA != contorB)
    {
        nod = Tata[nod];
        contorA--;
    }
    return nod;
}

int verificareGrad(int grad)
{
    int contor = 0;
    while(Tata[grad] != 0)
    {
        grad = Tata[grad];
        contor++;
    }
    return contor;
}

int LCA(int a, int b)
{
    int gradA = verificareGrad(a);
    int gradB = verificareGrad(b);

    if(gradA > gradB)
        a = echivalareGrad(a, gradA, gradB);
    else if(gradB > gradA)
        b = echivalareGrad(b, gradB, gradA);

    if(a == b) return a;

    else while(Tata[a] != Tata[b])
    {
        a = Tata[a];
        b = Tata[b];
    }

    return Tata[a];
}

void Citire()
{
    fin >> n >> m;
    for(int i = 2; i <= n; i++)
        fin >> Tata[i];
    Tata[1] = 0;
}

void Tiparire()
{
    while(!Solutie.empty())
    {
        fout << Solutie.front() << endl;
        Solutie.pop();
    }
}

int main()
{
    Citire();
    int a, b;
    for(int i = 1; i <= m; i++)
    {
        fin >> a >> b;
        Solutie.push(LCA(a, b));
    }
    Tiparire();
    return 0;
}