Cod sursa(job #3363811)

Utilizator Hutanu_MaiaHutanu Ioana-Maia Hutanu_Maia Data 23 august 2026 12:20:17
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct nl
{
    int nod,lvl;
}dp[20][200005];
int n,m,lg[200005],poz[100005];
vector<int> g[100005];
int cnt;
void dfs(int nod,int lvl)
{
    dp[0][++cnt]={nod,lvl};
    poz[nod]=cnt;
    for(auto i:g[nod])
    {
        dfs(i,lvl+1);
        dp[0][++cnt]={nod,lvl};
    }
}
int main()
{
    fin>>n>>m;
    for(int i=2; i<=n; i++)
    {
        int x;
        fin>>x;
        g[x].push_back(i);
    }
    dfs(1,0);
    for(int i=2; i<=cnt; i++)
        lg[i]=lg[i/2]+1;
    for(int p=1; p<=lg[cnt]; p++)
    {
        for(int i=1; i<=cnt-(1<<p)+1; i++)
        {
            if(dp[p-1][i].lvl>=dp[p-1][i+(1<<(p-1))].lvl)
                dp[p][i]=dp[p-1][i+(1<<(p-1))];
            else
                dp[p][i]=dp[p-1][i];
        }
    }
    int x,y,st,dr;
    while(m--)
    {
        fin>>x>>y;
        st=poz[x];
        dr=poz[y];
        if(st>dr)
            swap(st,dr);
        int dif=lg[dr-st+1];
        if(dp[dif][st].lvl<dp[dif][dr-(1<<dif)+1].lvl)
            fout<<dp[dif][st].nod<<'\n';
        else
            fout<<dp[dif][dr-(1<<dif)+1].nod<<'\n';
    }
    return 0;
}