Cod sursa(job #3164327)

Utilizator biancaivascuBianca Ivascu biancaivascu Data 2 noiembrie 2023 18:44:32
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;
#define MaxN 100000
int dp[18][MaxN], nivel[MaxN];
int ancestor(int x, int p)
{

    int cnt=0;
    while(p>0)
    {
        if(p%2==1) x=dp[cnt][x];
        p=p/2;
        cnt++;
    }
    return x;
}
int main()
{
    ifstream in("lca.in");
    ofstream out("lca.out");
    int n, m, i, u, v, j, st, dr, mij;
    in>>n>>m;
    dp[0][1]=0;
    nivel[1]=0;
    for(i=2; i<=n; i++)
    {
        in>>dp[0][i];
        nivel[i]=nivel[dp[0][i]]+1;
    }
    for(i=1; i<=17; i++)
    {
        for(j=1; j<=n; j++)
        {
            dp[i][j]=dp[i-1][dp[i-1][j]];
        }
    }

    for(i=0; i<m; i++)
    {
        in>>u>>v;
        if(nivel[v]<nivel[u])
        {

            u=ancestor(u, nivel[u]-nivel[v]);
        }
        else if(nivel[u]<nivel[v])
        {
            v=ancestor(v, nivel[v]-nivel[u]);
        }
        //cout<<ancestor(4, 1)<<" ";
        //cout<<u<<" "<<v<<endl;
        if(u==v) out<<u<<'\n';
        else
        {
            j=17;
            while(j>=0)
            {
                if(dp[j][u]!=dp[j][v])
                {
                    u=dp[j][u];
                    v=dp[j][v];
                }
                else
                {
                    j--;
                }
            }

            out<<dp[0][u]<<'\n';
        }

    }
    return 0;

}