Cod sursa(job #3311511)

Utilizator Luca_georgescuLuca Georgescu Luca_georgescu Data 22 septembrie 2025 20:19:11
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

const int nmax=1e5+5;
vector <vector <int> > gr(nmax+1);
int n,q,dp[nmax][35],h[nmax],logg;

void dfs(int nod, int parent)
{
    dp[nod][0]=parent;

    for (int v:gr[nod] )
    {
        h[v]=h[nod]+1;
        dfs(v,nod);
    }
}

int lca(int x, int y)
{
    if ( h[x]<h[y] )
        swap(x,y);

    int dif=h[x]-h[y];
    for (int i=logg; i>=0; i-- )
        if ( dif&(1<<i) ) {
           dif-=(1<<i);
           x=dp[x][i];
    }

    if ( x==y ) return x;

    for (int i=logg; i>=0; i-- )
    {
        if ( dp[x][i]!=-1 && dp[x][i]!=dp[y][i] )
        {
            x=dp[x][i];
            y=dp[y][i];
        }
    }

    return dp[x][0];

}

int main()
{
    f >> n >> q;
    logg=floor(log2(n))+1;

    for (int i=2; i<=n; i++ )
    {
        int x; f >> x;
        gr[x].push_back(i);
    }

    dfs(1,-1);

    for (int j=1; j<=logg; j++ )
        for (int i=1; i<=n; i++ )
            if ( dp[i][j-1]!=-1 )
                dp[i][j]=dp[dp[i][j-1]][j-1];
            else dp[i][j]=-1;

    while ( q-- )
    {
        int x,y; f >> x >> y;
        g << lca(x,y) << '\n';
    }
    return 0;
}