Cod sursa(job #2914904)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 21 iulie 2022 12:28:08
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m,euler[200005],nivel[100005],nr,lg[200005],rmq[18][200005],first[100005];
int tata[100005];

vector<int>fii[100005];

void dfs(int nod)
{
    nivel[nod]=nivel[tata[nod]]+1;
    euler[++nr]=nod;
    first[nod]=nr;

    for(int i=0; i<fii[nod].size(); i++)
    {
        int x=fii[nod][i];
        dfs(x);
        euler[++nr]=nod;
    }
}

int main()
{
    f>>n>>m;
    for(int i=2; i<=n; i++)
    {
        int x,y;
        f>>x;
        tata[i]=x;
        fii[x].push_back(i);
    }
    dfs(1);

    lg[1]=0;
    for(int i=2; i<=2*n; i++) lg[i]=lg[i/2]+1,rmq[0][i]=euler[i];
    rmq[0][1]=euler[1];

    for(int i=1; i<=lg[nr]; i++)
    {
        for(int j=1; j+(1<<i)-1<=nr; j++)
        {
            rmq[i][j]=rmq[i-1][j];
            if( nivel[rmq[i][j]]>nivel[rmq[i-1][j+(1<<(i-1))]] ) rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
        }
    }

    for(int i=1; i<=m; i++)
    {
        int x,y;
        f>>x>>y;
        x=first[x],y=first[y];
        if(x>y) swap(x,y);

        int loc=y-x+1,put=lg[loc];
        int sol=0;
        sol=rmq[put][x];
        if( nivel[sol]>nivel[rmq[put][y-(1<<put)]] ) sol=rmq[put][y-(1<<put)+1];
        g<<sol<<'\n';
    }
}