Cod sursa(job #3227103)

Utilizator camillaCamelia camilla Data 25 aprilie 2024 13:05:54
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
#define nivMAX 20
#define dim 100002
struct nod
{
    int t,h=0;
};
vector<nod> v;
int dp[nivMAX][dim];
void Egalare(int &x,int &y)
{
    bool sem;
    sem=0;
    if(v[x].h>v[y].h)
    {
        swap(x,y);
        sem=1;
    }
    int dif,nod,i;
    dif=v[y].h-v[x].h;
    i=nivMAX;
    nod=y;
    while(dif>0)
    {
        while((1<<i)>dif)
            i--;
        nod=dp[i][nod];
        dif-=(1<<i);
    }
    y=nod;
    if(sem==1)
    {
        swap(x,y);
    }
}
int Stramos(int x,int y)
{
    if(x==y)
        return x;
    int i,nod1,nod2;
    i=nivMAX;
    nod1=x;nod2=y;
    while(i>=0)
    {
        if(dp[i][nod1]==dp[i][nod2])
            i--;
        else
        {
            nod1=dp[i][nod1];
            nod2=dp[i][nod2];
        }
    }
    return v[nod1].t;
}

int main()
{
    int n,m,i,j,x,y,niv;
    fin>>n>>m;
    v.resize(n+1);
    for(i=2;i<=n;i++)
    {
        fin>>x;
        v[i].t=x;
        v[i].h=v[x].h+1;
        dp[0][i]=x;
    }
    niv=0;
    while((1<<niv)<=n)
    {
        niv++;
    }
    niv--;
    for(i=1;i<=niv;i++)
    {
        for(j=1;j<=n;j++)
        {
            dp[i][j]=dp[i-1][dp[i-1][j]];
        }
    }
    for(i=0;i<m;i++)
    {
        fin>>x>>y;
        if(v[x].h!=v[y].h)
        {
            Egalare(x,y);
        }
        fout<<Stramos(x,y)<<'\n';
    }
    return 0;
}