Cod sursa(job #3164313)

Utilizator laura2020Moldovan Laura laura2020 Data 2 noiembrie 2023 18:13:28
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
#define dim1 22
#define dim2 100001
struct nod
{
    int t,h=0;
};
vector<nod> v;
int dp[dim1][dim2];
void Niv(int &a,int &b)
{
    bool sem=0;
    if(v[a].h>v[b].h)
        swap(a,b),sem=1;
    //a e mai sus decat b
    int k=v[b].h-v[a].h,nod=b;
    int i=20;
    while(k>0)
    {
        while((1<<i)>k)
            i--;
        nod=dp[i][nod];
        k-=(1<<i);
    }
    b=nod;
    if(sem==1)
        swap(a,b);
}
int StrCom(int a,int b)
{
    if(a==b)
        return a;
    int i=20,n1=a,n2=b;
    while(i>=0)
    {
        if(dp[i][n1]==dp[i][n2])
            i--;
        else
        {
            n1=dp[i][n1];
            n2=dp[i][n2];
        }
    }
    return v[n1].t;
}

int main()
{
    int n,m,j,nr,i,k=0,a,b;
    fin>>n>>m;
    v.resize(n+1);
    for(i=2;i<=n;i++)
    {
        fin>>nr;
        v[i].t=nr;
        v[i].h=v[nr].h+1;
        dp[0][i]=nr;
    }
    while((1<<k)<=n)
        k++;
    k--;
    for(i=1;i<=k;i++)
    {
        for(j=1;j<=n;j++)
        {
            dp[i][j]=dp[i-1][dp[i-1][j]];
        }
    }
    for(i=0;i<m;i++)
    {
        fin>>a>>b;
        if(v[a].h!=v[b].h)
        {
            Niv(a,b);
        }
        fout<<StrCom(a,b)<<'\n';
    }
    return 0;
}