Cod sursa(job #2907454)

Utilizator szaszdavidSzasz David szaszdavid Data 30 mai 2022 11:50:51
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#define NMax 100000
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int f[20][NMax],level[NMax],log[NMax],n,m,i,j,x,y;
int stramos(int x,int l)
{
    for(i=0;i<=log[l];i++)
    {
        if(l%2 == 1)
            x=f[i][x];
        l=l/2;
    }

    return x;
}
void lca(int x,int y)
{
    if(level[x]!=level[y])
    {
        if(level[x]<level[y])
            swap(x,y);
        x = stramos(x,level[x]-level[y]);
    }
    int l = log[level[x]];
    for(i=l;i>=0;i--)
    {
        if(f[i][x]!=f[i][y])
        {
            x=f[i][x];
            y=f[i][y];
        }
    }
    fout<<f[0][x]<<"\n";

}
void next(int x)
{
    if(level[x]!=0)
        return;
    next(f[0][x]);
    level[x]=level[f[0][x]]+1;
}
void lvl()
{
    level[1]=0;
    for(int i=2;i<=n;i++)
        next(i);
}
int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>f[0][i];
    f[0][1]=0;
    for(j=1;(1<<j)<=n;j++)
    {
        for (i=1;i<=n-(1<<j)+1;i++)
        {
            f[j][i]=f[j-1][f[j-1][i]];
        }
    }
    lvl();
    log[1]=0;
    for(j=2;j<=n;j++)
        log[j]=1+log[j/2];
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        lca(x,y);
    }
    return 0;
}