Cod sursa(job #2085933)

Utilizator vladcoroian2001Vlad Coroian vladcoroian2001 Data 10 decembrie 2017 21:59:57
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>

using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");
const int nmax=1e5;
int n,m,a,b,dp[20][nmax],nivel[nmax];
int lca(int x,int y)
{
    if(nivel[x]<nivel[y])
        swap(x,y);
    if(nivel[x]!=nivel[y])
    {
        int log=0;
        while((1<<(log+1))<=nivel[x]-nivel[y])
            log++;
        while(log+1)
        {
            if(nivel[x]-nivel[y]>=(1<<log))
                x=dp[log][x];
            log--;
        }
    }
    int k=0;
    while((1<<(k+1))<=nivel[x])
            k++;
    if(x==y)
        return x;
    for(int i=k;i>=0;i--)
        if(dp[i][x] && dp[i][y]!=dp[i][x])
        {
            x=dp[i][x];
            y=dp[i][y];
        }
    return dp[0][x];
}
int main()
{
    fi>>n>>m;
    dp[0][1]=0;
    nivel[1]=1;
    for(int i=2;i<=n;i++)
    {
        fi>>dp[0][i];
        nivel[i]=nivel[dp[0][i]]+1;
    }
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i<=n;i++)
            dp[j][i]=dp[j-1][dp[j-1][i]];
    for(int i=1;i<=m;i++)
    {
        fi>>a>>b;
        fo<<lca(a,b)<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}