Cod sursa(job #2911893)

Utilizator ana_madalina_18Radu Ana Madalina ana_madalina_18 Data 4 iulie 2022 11:48:45
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m;
int nivel[100009], p_aparitie[100009];
int dp[200009][25];
vector <int> graf[100009], eul;
int logaritm;
void form_euler(int nod)
{
    for(int i=0;i<graf[nod].size();i++)
    {
        eul.push_back(nod);
        int vecin = graf[nod][i];
        nivel[vecin] = nivel[nod]+1;
        form_euler(vecin);
        eul.push_back(vecin);
    }
}
int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        int x;
        fin>>x;
        graf[x].push_back(i);
    }

    nivel[1] = 0;
    form_euler(1);
    eul.push_back(1);

    logaritm = log2(eul.size());

    for(int i=0;i<eul.size();i++)
    {
        if(p_aparitie[eul[i]]==0)
        {
            p_aparitie[eul[i]]=i;
        }
    }

    for(int i=0;i<eul.size();i++)
    {
        dp[0][i] = eul[i];
    }

    for(int i=1;i<=logaritm;i++)
    {
        for(int j=0;j<eul.size();j++)
        {
            if(nivel[dp[i-1][j]]<nivel[dp[i-1][j+(1<<(i-1))]])
            {
                dp[i][j] = dp[i-1][j];
            }
            else
            {
                dp[i][j]=dp[i-1][j+(1<<(i-1))];
            }
        }
    }

    for(int intrebare=1;intrebare<=m;intrebare++)
    {
        int a, b;
        fin>>a>>b;
        int x = p_aparitie[a];
        int y = p_aparitie[b];
        if(x>y)
        {
            int aux=x;
            x=y;
            y=aux;
        }
        int putere = log2(y-x+1);
        int val_putere = (1<<putere);
        if(nivel[dp[putere][x]]<nivel[dp[putere][y-val_putere+1]])
        {
            fout<<dp[putere][x]<<'\n';
        }
        else
        {
            fout<<dp[putere][y-val_putere+1]<<'\n';
        }
    }
    return 0;
}

//1 2 4 7 4 8 4 2 5 2 6 9 6 2 1 3 10 3 11 3 1