Cod sursa(job #2121107)

Utilizator vladavladaa vlada Data 3 februarie 2018 12:10:40
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

const int maxn = 100005;
const int maxk = 20;

int n, m, dad[maxn], deep[maxn], dp[maxk][maxn],f,l;
vector <int> g[maxn];
int stramos(int p,int q)
{
    for(int bit=0;bit<maxk;++bit)
    {
        if(p &(1<<bit))
            q=dp[bit][q];
    }
    return q;
}

int lca(int x,int y)
{
    if(deep[x]<deep[y])
        return lca(y,x);
    //deep[x]>deep[y];
    x=stramos(deep[x]-deep[y],x);
    if(x==y)
    return x;
    for(int k=maxk-1;k>=0;k--)
    {
        if(dp[k][x]!=dp[k][y]){
            x=dp[k][x];
            y=dp[k][y];}
    }
    return dp[0][x];
}
void dfs(int nod)
{
    for(int y=0;y<g[nod].size();y++)
    {
        deep[g[nod][y]]=deep[nod]+1;
        dfs(g[nod][y]);
    }
}
int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        fin>>dp[0][i];
        g[dp[0][i]].push_back(i);
    }
    deep[1]=1;
    dfs(1);
    //1<<i <= log2(n) <=> 1<=2^i<=n
    for(int i=1;i<maxk;++i)
        for(int j=1;j<=n;j++)
    {
        dp[i][j]=dp[i-1][dp[i-1][j]];
    }
    for(int i=1;i<=m;i++)
    {
        fin>>f>>l;
        fout<<lca(f,l)<<'\n';
    }
    return 0;
}