Cod sursa(job #2978006)

Utilizator razvanalexrotaruRazvan Alexandru Rotaru razvanalexrotaru Data 12 februarie 2023 19:17:05
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
#include <fstream>
#define cin fin
#define cout fout
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
vector<int>G[100008];
int v[200008],poz[100008],nvl[100008],m,n,x,cnt,i,j,a,b,aux;
struct element
{
    int val,nod;
};
element dp[200008][30];
void dfs(int nod,int nvl2)
{
    nvl[nod]=nvl2;
    v[++cnt]=nod;
    poz[nod]=cnt;
    for(auto i:G[nod])
    {
        if(nvl[i]==0)
        {
            dfs(i,nvl2+1);
            v[++cnt]=nod;
        }
    }
}
int main()
{
    cin>>n>>m;
    for(i=2;i<=n;i++)
    {
        cin>>x;
        G[x].push_back(i);
    }
    dfs(1,1);
    for(i=1;i<=cnt;i++)
    {
        dp[i][0].val=nvl[v[i]];
        dp[i][0].nod=v[i];
    }
    for(i=1;(1<<i)<=cnt;i++)
    {
        for(j=1;j<=cnt-(1<<i)+1;j++)
        {
            if(dp[j][i-1].val>dp[j+(1<<(i-1))][i-1].val)
            {
                dp[j][i]=dp[j+(1<<(i-1))][i-1];
            }
            else
            {
                dp[j][i]=dp[j][i-1];
            }
        }
    }
    for(i=1;i<=m;i++)
    {
        cin>>a>>b;
        a=poz[a];
        b=poz[b];
        if(a>b)
            swap(a,b);
        aux=(int)(log2(b-a));
        if(dp[a][aux].val>dp[b-(1<<aux)+1][aux].val)
            cout<<dp[b-(1<<aux)+1][aux].nod;
            else
            cout<<dp[a][aux].nod;
        cout<<'\n';
    }
    return 0;
}