Cod sursa(job #3001631)

Utilizator RobertlelRobert Robertlel Data 13 martie 2023 20:08:40
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

int viz[100005] , euler[100005] , x , n , q , k , niv[100005] , first[100005] , neul , arb[262144] , minim  , y , nr;

vector <int> v[100005];

void update (int nod , int left , int right , int poz , int val)
{
    if (left == right)
    {
        arb[nod] = val;
        return;
    }
    int mij = (left + right) / 2;
    if (poz <= mij)
        update (2 * nod , left , mij , poz , val);
    else
        update (2 * nod + 1 , mij + 1 , right , poz , val);
    if (niv[arb[2 * nod]] < niv[arb[2 * nod + 1]])
        arb[nod] = arb[2 * nod];
    else
        arb[nod] = arb[2 * nod + 1];

}

void querry (int nod , int left , int right , int ql , int qr)
{
    if (ql <= left && right <= qr)
    {
        if (niv[arb[nod]] < minim)
        {
            minim = niv[arb[nod]];
            nr = arb[nod];
        }
        return;
    }
    int mij = (left + right) / 2;
    if (ql <= mij)
        querry (2 * nod , left , mij , ql , qr);
    if (qr > mij)
        querry (2 * nod + 1 , mij + 1 , right , ql , qr);
}

void dfs (int nod , int nivel)
{
    euler[++k] = nod;
    niv[nod] = nivel;
    first[nod] = k;
    for (int i = 0 ; i < v[nod].size () ; i++)
    {
        int vecin = v[nod][i];
        dfs (vecin , nivel + 1);
        euler[++k] = nod;
    }
}

int main()
{
    f >> n >> q;

    for (int i = 2 ; i <= n ; i++)
    {
        f >> x;
        v[x].push_back (i);
    }

    dfs (1 , 0);
    neul = k;

    for (int i = 1 ; i <= neul ; i++)
        update (1 , 1 , neul , i , euler[i]);


    for (int i = 1 ; i <= q ; i++)
    {
        f >> x >> y;
        if (first[x] < first[y])
        {
             minim = 2e9 , nr = 0;
            querry (1 , 1 , neul , first[x] , first[y]);
            g << nr << '\n';
        }
        else
        {
             minim = 2e9 , nr = 0;
            querry (1 , 1 , neul , first[y] , first[x]);
            g << nr << '\n';
        }
    }



    return 0;
}