Cod sursa(job #2775076)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 14 septembrie 2021 10:17:07
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
#define NMAX 100010
#define LOG 19

using namespace std;

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

int n, m, q, poz[NMAX], depth[2 * NMAX], lg[2 * NMAX];
pair <int, int> rmq[LOG][2 * NMAX];
vector <int> edges[NMAX];

void dfs(int nod, int niv)
{
    rmq[0][++m].second = nod;
    rmq[0][m].first = niv;
    poz[nod] = m;

    for(auto child : edges[nod])
    {
        dfs(child, niv + 1);
        rmq[0][++m].second = nod;
        rmq[0][m].first = niv;
    }
}

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

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

    dfs(1, 0);
    for(int i = 2; i <= m; i++)
        lg[i] = lg[i / 2]  + 1;

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

    for(int i = 1; i <= q; i++)
    {
        int x, y;
        f >> x >> y;
        x = poz[x];
        y = poz[y];
        if(x > y)
            swap(x, y);
        int k = lg[y - x];
        if(rmq[k][x].first > rmq[k][y - (1 << k) + 1].first)
            g << rmq[k][y - (1 << k) + 1].second << "\n";
        else
            g << rmq[k][x].second << "\n";
    }

    return 0;
}