Cod sursa(job #2951188)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 5 decembrie 2022 17:10:19
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector<int>g[100005];
vector<int>v;
int nivel[100005];
int lvl=1;
int noduri;
void dfs(int node,int lvl)
{
    v.push_back(node);
    nivel[node]=lvl;
    lvl++;
    for(int i=0;i<g[node].size();i++)
    {
        if(nivel[g[node][i]]==0)
        {
            dfs(g[node][i],lvl);
        }
        v.push_back(node);
    }
}
int lastappearencex=0,lastappearencey=0;
void findinterv(int x,int y)
{
    for(int i=0;i<v.size();i++)
    {
        if(v[i]==x)
            lastappearencex=i;
        if(v[i]==y)
            lastappearencey=i;
    }
}

int findancestor(int lastappearencex,int lastappearencey)
{
    int mini=100004;
    nivel[mini]=1e9;
    int node;
    if(lastappearencex>lastappearencey)
        swap(lastappearencex,lastappearencey);
    for(int i=lastappearencex;i<=lastappearencey;i++)
    {
        node=v[i];
        if(nivel[node]<nivel[mini])
            mini=node;
    }
    return mini;
}
int main()
{
    int perechi;
    in>>noduri>>perechi;
    for(int i=2;i<=noduri;i++)
    {
        int node;
        in>>node;
        g[node].push_back(i);

    }
    dfs(1,1);
    /*for(int i=0;i<v.size();i++)
    {
        out<<v[i]<<' ';
    }

    out<<'\n';
     for(int i=0;i<v.size();i++)
    {
        out<<nivel[v[i]]<<' ';
    }
    out<<'\n';*/
    for(int i=1;i<=perechi;i++)
    {
        int x,y;
        in>>x>>y;
        findinterv(x,y);
        out<<findancestor(lastappearencex,lastappearencey)<<'\n';
    }
    return 0;
}