Cod sursa(job #2187123)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 26 martie 2018 11:19:02
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <cstring>

using namespace std;
vector <int> g[100005];
int n,m,x,y,k;
vector <int> dp[90];
int ad[100005];
int pa[100005];
vector <int> loc;
void dfs(int nod, int niv)
{
    ad[nod]=niv;
    if(pa[nod]==-1)
        pa[nod]=dp[0].size();
    dp[0].push_back(nod);
    for(int i: g[nod])
        dfs(i,niv+1), dp[0].push_back(nod);
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d", &n,&m);
    for(int i=1;i<n;++i)
    {
        scanf("%d", &x);
        g[x].push_back(i+1);
    }
    memset(pa,-1,sizeof pa);
    dfs(1,0);
    n=dp[0].size();
    //for(int i:dp[0])
    //    cout<<i<<" ";
    //cout<<"\n";
    for(int i=1;(1<<i)<=n;++i)
    {
        for(int j=0;j+(1<<(i))<n;++j)
            if(ad[dp[i-1][j]]<ad[dp[i-1][j+(1<<(i-1))]])
                dp[i].push_back(dp[i-1][j]);
            else
                dp[i].push_back(dp[i-1][j+(1<<(i-1))]);
    }
    //for(int i=0;(1<<i)<=n;++i, printf("\n"))
      //  for(int j: dp[i])
        //    cout<<j<<" ";
    for(int i=0;i<m;++i)
    {
        scanf("%d%d", &x,&y);
        x=pa[x];
        y=pa[y];
        if(x > y){
            swap(x, y);
        }
        k=log2(y-x+1);
        if(ad[dp[k][x]]<ad[dp[k][y-(1<<k)+1]])
            cout<<dp[k][x]<<"\n";
        else
            cout<<dp[k][y-(1<<k)+1]<<"\n";
    }
    return 0;
}