Cod sursa(job #3283977)

Utilizator CaldareaCiprianCaldarea Ciprian CaldareaCiprian Data 10 martie 2025 19:45:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

using VI = vector<int>;
using VVI = vector<VI>;

int n, q, timer;
VI tin, tout;
VVI G, anc;
int malog;

void DFS(int x)
{
    tin[x] = ++timer;

    for (auto y : G[x])
    {
        anc[0][y] = x;
        DFS(y);
    }



    tout[x] = timer;
}

bool Contains(int x, int y)
{
    return ((tin[x] <= tin[y]) && (tout[x] >= tout[y]));
}

int LCA(int x, int y)
{
    if (Contains(x, y))
        return x;

    if (Contains(y, x))
        return y;

    for (int i = malog; i >= 0; --i)
    {
        if (!Contains(anc[i][x], y))
            x = anc[i][x];
    }

    return anc[0][x];
}
int main()
{
    fin >> n >> q;

    int z;
    malog = ceil(log2(n));
    G = VVI(n + 1);
    anc = VVI(malog + 1, VI(n + 1));
    tin = tout = VI(n + 1);


    for (int i = 2; i <= n; ++i)
    {
        fin >> z;
        G[z].emplace_back(i);
    }
    anc[0][1] = 1;
    DFS(1);

    for (int i = 1; i <= malog; ++i)
        for (int j = 1; j <= n; ++j)
            anc[i][j] = anc[i - 1][anc[i - 1][j]];


    int x, y;
    for (int i = 1; i <= q; ++i)
    {
        fin >> x >> y;
        fout << LCA(x, y) << '\n';
    }
}