Cod sursa(job #2973100)

Utilizator RobertlelRobert Robertlel Data 30 ianuarie 2023 22:31:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

int euler[200005] , niv[200005]  , n , m , i  , k , last[200005] , rmq[200005][19] , x , y , aux , vecin;

vector <int>v[200005];

int querry (int a , int b)
{
    int k = 0;
    while ( (1 << k) <= (b - a + 1))
        k++;
    k--;
    if (niv[rmq[a][k]] < niv[rmq[b - (1 << k) + 1][k]])
        return rmq[a][k];
    else
        return rmq[b - (1 << k) + 1][k];
}

void dfs (int nod , int poz)
{
    euler[++k] = nod;
    niv[nod] = poz;
    last[nod] = k;
    for (auto vecin : v[nod])
    {
            dfs (vecin , poz + 1);
            euler[++k] = nod;

            last[nod] = k;
    }
}

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

    for (int i = 1 ; i <= k ; i++)
       rmq[i][0] = euler[i];
       aux = k;
    for (int k = 1 ; (1 << k) <= aux ; k++)
    {
        for (int i = 1 ; i + (1 << k) - 1 <= aux ; i++)
            if (niv[rmq[i][k - 1]] < niv[rmq[i + (1 <<(k - 1))][k - 1]])
                rmq[i][k] = rmq[i][k - 1];
            else
                rmq[i][k] = rmq[i + (1 <<(k - 1))][k - 1];

    }
    for (int i = 1 ; i <= m ; i++)
    {
        f >> x >> y;
        if (last[x] < last[y])
        g << querry (last[x] , last[y]) << '\n';
        else
            g << querry (last[y] , last[x]) << '\n';
    }

    return 0;
}