Cod sursa(job #3153103)

Utilizator BOSSSTEFANPetrescu Ioan Stefan BOSSSTEFAN Data 28 septembrie 2023 02:30:45
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int dp[18][202],t,v[101];
vector <int> g[100001];
void dfs(int k)
{
    for(size_t i=0;i<g[k].size();i++)
    {
        dp[0][++t]=g[k][i];
        v[g[k][i]]=t;
        dfs(g[k][i]);
        dp[0][++t]=k;
    }
}
int main()
{
    int n,m,x,i,y,j;
    cin>>n>>m;
    for(i=1;i<n;i++)
    {
        cin>>x;
        g[x].push_back(i+1);
    }
    t=1;
    dp[1][0]=1;
    v[1]=1;
    dfs(1);
    for(i=1;(1<<i)<=2*n-1;i++)
        for(j=1;j+(1<<i)-1<=2*n-1;j++)
            dp[i][j]=min(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
    int nr,k;
    for(i=1;i<=m;i++)
    {
        cin>>x>>y;
        x=v[x];
        y=v[y];
        if(x>y)
            swap(x,y);
        nr=y-x+1;
        k=0;
        while(nr>0)
        {
            k++;
            nr>>=1;
        }
        k--;
        cout<<min(dp[k][x],dp[k][y-(1<<k)+1])<<'\n';
    }
    return 0;
}