Cod sursa(job #2570793)

Utilizator spartanul300Vasile Andrei spartanul300 Data 4 martie 2020 19:23:07
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

vector <int> euler,v[100100];
int indice,poz[100100],H[100100];

void parcurgere_euler(int nod)
{
    indice++;
    if(poz[nod]==0)poz[nod]=indice;
    euler.push_back(nod);

    for(int i=0;i<v[nod].size();i++)
    {
        int vecin=v[nod][i];
        H[vecin]=H[nod]+1;

        parcurgere_euler(vecin);

        indice++;
        if(poz[nod]==0)poz[nod]=indice;
        euler.push_back(nod);
    }
}

int n,m,i,x,N,k,sol1,sol2,K,a,b,p1,p2,dp[2*100100][20];
int main()
{
    f>>n>>m;
    for(i=1;i<=n-1;i++)
    {
        f>>x;
        v[x].push_back(i+1);
    }

    H[1]=1;
    parcurgere_euler(1);

    N=euler.size();
    for(i=1;i<=N;i++)dp[i][0]=euler[i-1];

    for(k=1;(1<<k)<=N;k++)
    {
        for(i=1;i+(1<<k)-1<=N;i++)
        {
            sol1=dp[i][k-1];
            sol2=dp[i+(1<<(k-1))][k-1];

            if(H[sol1]<H[sol2])dp[i][k]=sol1;
            else dp[i][k]=sol2;
        }
    }

    for(i=1;i<=m;i++)
    {
        f>>a>>b;
        p1=poz[a];
        p2=poz[b];
        if(p1>p2)swap(p1,p2);

        K=log2(p2-p1+1);
        sol1=dp[p1][K];
        sol2=dp[p2-(1<<K)+1][K];

        if(H[sol1]<H[sol2])g<<sol1<<'\n';
        else g<<sol2<<'\n';
    }
    return 0;
}