Cod sursa(job #3030685)

Utilizator pifaDumitru Andrei Denis pifa Data 17 martie 2023 20:10:26
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

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

int n, q;

const int N = 1e5 + 5;

int euler[2 * N], timp, prima[N];

int niv[N];

vector <int> g[N];

void dfs(int nod, int nivel)
{
    timp++;
    euler[timp] = nod;
    prima[nod] = timp;
    niv[nod] = nivel;
    for(auto it:g[nod])
    {
        dfs(it, nivel + 1);
        euler[++timp] = nod;
    }
}

int cmp(int x, int y)
{
    return niv[x] < niv[y];
}

int rmq[20][N];

int lg[N];

signed main()
{
    in >> n >> q;
    for(int i = 2; i <= n; i++)
    {
        int x;
        in >> x;
        g[x].push_back(i);
    }
    dfs(1, 1);
    for(int i = 1; i <= timp; i++)
    {
        rmq[0][i] = euler[i];
        if(i > 1)
        {
            lg[i] = lg[i / 2] + 1;
        }
    }
    for(int e = 1; (1 << e) <= timp; e++)
    {
        for(int i = 1; i + (1 << (e - 1)) - 1 <= timp; i++)
        {
            rmq[e][i] = min(rmq[e - 1][i], rmq[e - 1][i + (1 << (e - 1))], cmp);
        }
    }
    while(q--)
    {
        int x, y;
        in >> x >> y;
        x = prima[x];
        y = prima[y];
        if(x > y)
            swap(x, y);
        int len = y - x + 1, e = lg[len];
        out << min(rmq[e][x], rmq[e][y - (1 << e) + 1], cmp) << '\n';
    }
    return 0;
}