Cod sursa(job #3322933)

Utilizator 0021592Grecu rares 0021592 Data 16 noiembrie 2025 11:45:34
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
struct pseudopair
{
    int euler, level;
};
vector<pseudopair> v;
int n, m, i, x, y, j, contor, rmq[20][200010], first[100010];
bool viz[100010];
vector<vector<int>> mat;
void dfs(int x, int depth)
{
    if (first[x] == 0)
        first[x] = contor;
    rmq[0][contor] = contor;
    v.push_back({x, depth});
    ++contor;
    viz[x] = 1;
    for (auto ind : mat[x])
        if (viz[ind] == 0)
        {
            dfs(ind, depth+1);
            rmq[0][contor] = contor;
            v.push_back({x, depth});
            ++contor;
        }
}
int main()
{
    in >> n >> m;
    mat.resize(n+2);
    for (i = 2; i <= n; i++)
    {
        in >> x;
        mat[i].push_back(x);
        mat[x].push_back(i);
    }
    dfs(1, 0);
    for (i = 1; (1<<i) <= contor; i++)
    {

        for (j = 0; j < contor - (1<<i) +1; j++)
        {
            rmq[i][j] = rmq[i-1][j];
            if (v[rmq[i][j]].level > v[rmq[i-1][j+(1<<(i-1))]].level)
                rmq[i][j] = rmq[i-1][j+(1<<(i-1))];
            //out << rmq[i][j] << ' ';
        }
        //out << '\n';
    }
    while(m)
    {
        --m;
        in >> x >> y;
        if (first[x] > first[y])
            swap(x, y);
        int dist = first[y] - first[x] + 1;
        int l2 = log2(dist);
        if (v[rmq[l2][first[x]]].level > v[rmq[l2][first[y]-(1<<l2)+1]].level)
            out << v[rmq[l2][first[y]-(1<<l2)+1]].euler;
        else
            out << v[rmq[l2][first[x]]].euler;
        out << '\n';
    }
    return 0;
}