Cod sursa(job #2452444)

Utilizator ezioconnorVlad - Gabriel Iftimescu ezioconnor Data 30 august 2019 18:49:54
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, nr;
int euler[200001], nivel[200001], first[100001], tata[100001], lg[200001];
pair <int, int> rmq[20][200001];
vector <int> Muchii[100001];

inline void DFS(int nod)
{
    euler[++nr] = nod;
    nivel[nr] = nivel[tata[nod]] + 1;
    if (!first[nod])
        first[nod] = nr;
    for (int i = 0; i < Muchii[nod].size(); ++i)
    {
        DFS(Muchii[nod][i]);
        euler[++nr] = nod;
        nivel[nr] = nivel[tata[nod]] + 1;
    }
}

inline void citire()
{
    in >> n >> m;
    for (int i = 2; i <= n; ++i)
    {
        in >> tata[i];
        Muchii[tata[i]].push_back(i);
    }
}

int main()
{
    int x, y;
    citire();
    DFS(1);
    for (int i = 2; i <= nr; ++i)
        lg[i] = lg[(i >> 1)] + 1;
    for (int i = 1; i <= nr; ++i)
        rmq[0][i] = {euler[i], nivel[i]};
    for (int l = 1; (1 << l) <= nr; ++l)
    {
        for (int i = 1; i + (1 << l) <= nr; ++i)
        {
            int salt = 1 << (l - 1);
            rmq[l][i] = min(rmq[l - 1][i], rmq[l - 1][i + salt]);
        }
    }
    while (m--)
    {
        in >> x >> y;
        if (first[x] > first[y])
            swap(x, y);
        int diff = first[y] - first[x] + 1, l = lg[diff], salt = diff - (1 << l);
        pair <int, int> rez = {0, INT_MAX};
        if (rmq[l][first[x]].second < rez.second)
            rez = rmq[l][first[x]];
        if (rmq[l][first[x] + salt].second < rez.second)
            rez = rmq[l][first[x] + salt];
        out << rez.first << '\n';
    }
    return 0;
}