Cod sursa(job #2616060)

Utilizator nicholascantarNicholas David Cantar Gogitidze nicholascantar Data 16 mai 2020 15:38:50
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;
vector <int> v[100100];
vector <int> 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,k,K,x,y,p1,p2,nod_minim,lungime_interval,adancime_minima,dmin[500100][20],dindice[500100][20];
int main()
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");

    fin>>n>>m;
    for(i=1;i<=n-1;i++)
    {
        fin>>x;
        v[x].push_back(i+1);
    }
    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++)
    {
        fin>>x>>y;
        p1=poz[x];
        p2=poz[y];
        if(p1>p2)swap(p1,p2);
        lungime_interval=p2-p1+1;
        K=log2(lungime_interval);
        adancime_minima=min(dmin[p1][K],dmin[p2-(1<<K)+1][K]);
        if(dmin[p1][K] < dmin[p2-(1<<K)+1][K])nod_minim=dindice[p1][K];
        else nod_minim=dindice[p2-(1<<K)+1][K];

        fout<<nod_minim<<'\n';
    }
    return 0;
}