Cod sursa(job #3301990)

Utilizator camillaCamelia camilla Data 1 iulie 2025 21:26:40
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
#define dim 100005
int dp[dim][20],niv[dim];
vector<int> v[dim];
void dfs(int nod,int t)
{
    for(auto x:v[nod])
    {
        if(x!=t)
        {
            niv[x]=niv[nod]+1;
            dfs(x,nod);
        }
    }
}
void Niv(int &x,int &y)
{
    if(niv[x]<niv[y])
        swap(x,y);
    /// y e mai sus decat x
    int k=19;
    while(niv[x]>niv[y])
    {
        if(niv[x]-1LL*(1<<k)>=niv[y])
        {
            x=dp[x][k];
        }
        k--;
    }
}
int stramos(int x,int y)
{
    if(x==y)
        return x;
    long long k=19,xn,yn;
    while(k>=0)
    {
        xn=dp[x][k];
        yn=dp[y][k];
        if(xn!=yn)
        {
            x=xn;
            y=yn;
        }
        k--;
    }
    return dp[x][0];
}

int main()
{
    int n,m,j,i,x,y,k;
    fin>>n>>m;
    for(i=2;i<=n;i++)
    {
        fin>>x;
        v[x].push_back(i);
        dp[i][0]=x;
    }
    dfs(1,0);
    k=0;
    while((1<<k)<=n)
        k++;
    k--;
    for(i=1;i<=k;i++)
    {
        for(j=2;j<=n;j++)
        {
            dp[j][i]=dp[dp[j][i-1]][i-1];
        }
    }
    for(i=0;i<m;i++)
    {
        fin>>x>>y;
        if(niv[x]!=niv[y])
        {
            //cout<<x<<" "<<y<<" : ";
            Niv(x,y);
            //cout<<x<<" "<<y<<endl;
        }
        fout<<stramos(x,y)<<'\n';
    }
    return 0;
}