Cod sursa(job #3329691)

Utilizator DasapSapunaru Daniel Dasap Data 14 decembrie 2025 22:33:47
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, m, i, grad[100005], first[100005], rmq[18][200005], sz, lg[200005], mx, p, x, y, a, b;
vector<int>v[100005], euler;
void dfs (int nod, int tata)
{
    euler.push_back (nod);
    first[nod] = euler.size() - 1;
    for (auto x : v[nod])
    {
        if (x == tata) continue;
        grad[x] = grad[nod] + 1;
        dfs (x, nod);
        euler.push_back (nod);
    }
}
int main()
{
    fin >> n >> m;
    euler.push_back (0);
    for (i = 2; i <= 2 * n; i++) lg[i] = lg[i / 2] + 1;
    for (i = 2; i <= n; i++)
    {
        fin >> x;
        v[i].push_back (x);
        v[x].push_back (i);
    }
    grad[1] = 1;
    dfs (1, 0);
    sz = euler.size() - 1;
    mx = lg[sz];
    for (i = 1; i <= sz; i++) rmq[0][i] = euler[i];
    for (p = 1; p <= mx; p++)
        for (i = 1; i <= sz - (1 << p) + 1; i++)
        {
            if (grad[rmq[p - 1][i]] < grad[rmq[p - 1][i + (1 << (p - 1))]]) rmq[p][i] = rmq[p - 1][i];
            else rmq[p][i] = rmq[p - 1][i + (1 << (p - 1))];
        }
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y;
        x = first[x];
        y = first[y];
        if (y < x) swap (x, y);
        p = lg[y - x + 1];
        a = rmq[p][x];
        b = rmq[p][y - (1 << p) + 1];
        if (grad[a] > grad[b]) fout << b;
        else fout << a;
        fout << '\n';
    }
    return 0;
}