Cod sursa(job #2213440)

Utilizator AndreiDumitrescuAndrei Dumitrescu AndreiDumitrescu Data 16 iunie 2018 14:13:00
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

int tati[100010], nivel[100010], care_lant[100010], boss_lant[100010];
vector < vector<int>> copii;
vector < vector<int>> lant;

int k;

int dfs_ul_ala_blanao(int nod, int nivel_actual)
{
    nivel[nod] = nivel_actual;
    int ok = 0;
    for(int i = 0; i < copii[nod].size(); i++)
    {
        dfs_ul_ala_blanao(copii[nod][i], nivel_actual+1);
        ok = 1;
    }
    if(ok == 0)
    {
        lant[k].push_back(nod);
        care_lant[nod] = k;
        k++;
    }
    else
    {
        int maxim = 0, care;
        for(int i = 0; i < copii[nod].size(); i++)
        {
            if(lant[care_lant[copii[nod][i]]].size() > maxim)
            {
                maxim = lant[care_lant[copii[nod][i]]].size();
                care = care_lant[copii[nod][i]];
            }
        }
        lant[care].push_back(nod);
        care_lant[nod] = care;
        for(int i = 0; i < copii[nod].size(); i++)
        {
            if(care_lant[copii[nod][i]] != care)
            {
                boss_lant[care_lant[copii[nod][i]]] = nod;
            }
        }
    }
    return 0;
}

int parcurgere(int x, int y)
{
    if(care_lant[x] != care_lant[y])
    {
        if(nivel[x] > nivel[y])
        {
            parcurgere(boss_lant[care_lant[x]], y);
        }
        else
        {
            parcurgere(x, boss_lant[care_lant[y]]);
        }
    }
    else
    {
        if(nivel[x] > nivel[y])
            return y;
        return x;
    }
}

int main()
{
    int n, m, x, y;
    f >> n >> m;
    copii.resize(n + 2);
    lant.resize(n + 2);
    for(int i = 2; i <= n; i++)
    {
        f >> x;
        copii[x].push_back(i);
        tati[i] = x;
    }
    dfs_ul_ala_blanao(1, 0);
    /*for(int i = 0; i < k ; i++)
    {
        g << "Lantul " << i+1 <<": " << endl;
        for(int j = 0; j < lant[i].size(); j++)
            g << lant[i][j] << " ";
        g << endl;
        g <<"Boss-ul: " << boss_lant[i] << endl;
    } */
    for(int i = 0; i < m; i++)
    {
        f >> x >> y;
        g << parcurgere(x, y) << '\n';
    }
    return 0;
}