Cod sursa(job #2786628)

Utilizator mateitudordmDumitru Matei mateitudordm Data 21 octombrie 2021 12:29:38
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

vector<int> ad[100001];
int v[100001],euler[200001],h[200001],mq[18][200001],pe=0,le[200001];
void dfs(int nod,int he)
{
    le[nod]=pe;
    euler[pe]=nod;
    h[pe]=he;
    pe++;
    for(int i=0; i<ad[nod].size(); i++)
    {
        dfs(ad[nod][i],he+1);
        le[nod]=pe;
        euler[pe]=nod;
        h[pe]=he;
        pe++;
    }
}
void rmq()
{
    for(int i=1; i<pe; i++)
        mq[0][i]=i;
    for(int i=1; (1<<i)<=pe; i++)
    {
        for(int j=1; j<=pe; j++)
        {
            if(h[mq[i-1][j]]<h[mq[i-1][j+(1<<(i-1))]])
                mq[i][j]=mq[i-1][j];
            else
                mq[i][j]=mq[i-1][j+(1<<(i-1))];
        }
    }
}

int main()
{
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    int n,k,a,i,b,dif,p,ml1,ml2;
    cin>>n>>k;
    for(i=2; i<=n; i++)
    {
        cin>>v[i];
        ad[v[i]].push_back(i);
    }
    dfs(1,0);
    rmq();
    for(i=1; i<=k; i++)
    {
        cin>>a>>b;
        ml1=min(le[a],le[b]);
        ml2=max(le[a],le[b]);
        dif=ml2-ml1+1;
        dif=log2(dif);
        if(h[mq[dif][ml1]]<h[mq[dif][ml2-(1<<dif)+1]])
            cout<<euler[mq[dif][ml1]]<<'\n';
        else
            cout<<euler[mq[dif][ml2-(1<<dif)+1]]<<'\n';
    }
    return 0;
}