Cod sursa(job #2723234)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 13 martie 2021 19:41:15
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

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

vector <int> euler, v[100100];
int indice,h[100100],first_appear[100100];

void parcurgere_euler(int nod)
{
    indice++;
    if(first_appear[nod]==0)first_appear[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++;
        euler.push_back(nod);
    }
}

int n,m,x,k,N,y,i,dp[200100][20];
int main()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }

    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++)
        {
            if(h[dp[i][k-1]] < h[dp[i+(1<<(k-1))][k-1]])dp[i][k]=dp[i][k-1];
            else dp[i][k]=dp[i+(1<<(k-1))][k-1];
        }
    }

    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        x=first_appear[x];
        y=first_appear[y];
        k=log2(y-x+1);

        if(h[dp[x][k]] < h[dp[y-(1<<k)+1][k]])g<<dp[x][k]<<'\n';
        else g<<dp[y-(1<<k)+1][k]<<'\n';
    }
    return 0;
}