Cod sursa(job #2720655)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 11 martie 2021 09:34:10
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

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

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

void parcurgere_euler(int nod, int adancime_nod)
{
    int i;
    indice++;
    if(poz[nod]==0)poz[nod]=indice;

    euler.push_back(nod);
    adancime.push_back(adancime_nod);

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

        indice++;
        euler.push_back(nod);
        adancime.push_back(adancime_nod);
    }
}

int n,m,i,N,x,y,p1,p2,k,K,a,dmin[500100][20],dindice[500100][20];
int main()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }

    parcurgere_euler(1,0);

    N=euler.size();
    for(i=1;i<=N;i++)
    {
        dmin[i][0]=adancime[i-1];
        dindice[i][0]=euler[i-1];
    }

    for(k=1;(1<<k)<=N;k++)
    {
        for(i=1;i+(1<<k)-1<=N;i++)
        {
            dmin[i][k]=min(dmin[i][k-1],dmin[i+(1<<(k-1))][k-1]);

            if(dmin[i][k-1]<dmin[i+(1<<(k-1))][k-1])dindice[i][k]=dindice[i][k-1];
            else dindice[i][k]=dindice[i+(1<<(k-1))][k-1];
        }
    }

    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        p1=poz[x];
        p2=poz[y];

        if(p1>p2)swap(p1,p2);
        K=log2(p2-p1+1);

        if(dmin[p1][K] < dmin[p2-(1<<K)+1][K])g<<dindice[p1][K]<<'\n';
        else g<<dindice[p2-(1<<K)+1][K]<<'\n';
    }
    return 0;
}