Cod sursa(job #3003892)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 15 martie 2023 23:44:52
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int log[100005];
vector<int>g[100005];
int noduri;
void logaritm()
{
    log[1]=0;
    log[2]=1;
    for(int i=3;i<=noduri;i++)
        log[i]=1+log[i/2];
}
int nivel[100005],level=1;
int stramos[19][100005];
void dfs(int node,int level)
{
    nivel[node]=level;
    level++;
    for(int i=0;i<g[node].size();i++)
    {
        if(nivel[g[node][i]]==0)
        {
            dfs(g[node][i],level);
        }
    }
}
int equalize(int up,int node)
{
    for(int i=log[noduri];i>=0;i--)
        if(nivel[node]-1>=(1<<i) && up>=(1<<i) && stramos[i][node]!=0)
        {
            node=stramos[i][node];
            up=up-(1<<i);
        }
    return node;
}
void findstramos(int x,int y)
{
    if(x==y)
        out<<x<<'\n';
    else
    {
        for(int i=log[noduri];i>=0;i--)
            if(stramos[i][x]!=stramos[i][y])
            {
                x=stramos[i][x];
                y=stramos[i][y];
            }
        out<<stramos[0][x]<<'\n';
    }
}
int main()
{
    int perechi;
    in>>noduri>>perechi;
    logaritm();
    for(int i=2;i<=noduri;i++)
    {
        in>>stramos[0][i];
        g[stramos[0][i]].push_back(i);

    }
    dfs(1,1);
    for(int i=1;i<=log[noduri];i++)
        for(int j=1;j<=noduri;j++)
        {
            stramos[i][j]=stramos[i-1][stramos[i-1][j]];
        }

    for(int i=1;i<=perechi;i++)
    {
        int x,y;
        in>>x>>y;
        int copil;
        if(nivel[x]!=nivel[y])
        {
            int up=0;
            if(nivel[x]>nivel[y])
            {
                up=nivel[x]-nivel[y];
                copil=equalize(up,x);
                findstramos(copil,y);
            }
            else
            {
                up=nivel[y]-nivel[x];
                copil=equalize(up,y);
                findstramos(copil,x);
            }

        }
        else
            findstramos(x,y);
        //out<<nivel[x]<<' '<<nivel[y]<<'\n';
    }

    return 0;
}