Cod sursa(job #2466436)

Utilizator paul_danutDandelion paul_danut Data 2 octombrie 2019 10:29:54
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <vector>
#include <set>

int findLCA(const std::vector<int>& parents, int x, int y, int root)
{
    std::set<int> s;
    s.insert(root);
    int parent = x;
    while(parent != root)
    {
        s.insert(parent);
        parent = parents[parent-1];
    }

    parent = y;
    bool found = false;
    while(parent != root && !found)
    {
        if(s.find(parent) != s.end())
        {
            found = true;
        }
        else
        {
            parent = parents[parent-1];
        }
    }

    return parent;
}

int main()
{
    std::ifstream fin("lca.in");
    std::ofstream fout("lca.out");

    auto n=0, m=0, x=0, y=0, root = 1;
    fin>>n>>m;
    std::vector<int> parents;
    parents.push_back(-1); // primul nod este nodul radacina

    for(auto i=0; i < n-1; ++i)
    {
        fin>>x;
        parents.push_back(x);
    }

    for(auto i=0; i < m; ++i)
    {
        fin >> x >> y;
        fout << findLCA(parents, x, y, root) << '\n';
    }

    return 0;
}