Cod sursa(job #2842020)

Utilizator Andrei012Trache Andrei Andrei012 Data 30 ianuarie 2022 21:53:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("lca.in");
ofstream out("lca.out");
vector<int> v[100002];
int aint[1000001],dp[300000],parc[100001],n,m,first[100001],rmq[300001][21];
int cat;

void dfs(int nod)
{
    parc[nod]=1;
    for(auto nod2 : v[nod])

        if(parc[nod2]==0)
        {
            dp[nod2]=dp[nod]+1;
            dfs(nod2);
        }
}


void euler(int nod){
    ++cat;
    rmq[cat][0]=nod;
    first[nod]=cat;
    parc[nod]=1;
    for(auto nod2 : v[nod])
        if(parc[nod2]==0)
        {
            euler(nod2);
            ++cat;
            rmq[cat][0]=nod;
        }
}

int main()
{
    int i,j,x,a,b,l,r,k;
    in>>n>>m;
    for(i=2;i<=n;++i){
        in>>x;
        v[x].push_back(i);
    }
    dfs(1);
    for(i=1;i<=n;++i)
        parc[i]=0;
    dp[0]=1e8;
    euler(1);
    for(j=1;(1<<j)<=2*n-1;++j)
        for(i=1;i<=2*n-(1<<j);++i)
            rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
    for(i=1;i<=m;++i){
        in>>a>>b;
        l=min(first[a],first[b]);
        r=max(first[a],first[b]);
        k=log2(r-l+1);
        out<<min(rmq[l][k],rmq[r-(1<<k)+1][k])<<'\n';
    }

    return 0;
}