Cod sursa(job #3214078)

Utilizator ana_valeriaAna Valeria Duguleanu ana_valeria Data 13 martie 2024 19:20:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
#define MAX 100000
#define LOG 20
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
int level[MAX + 10], ancestor[LOG + 10][MAX + 10];
vector <int> graph[MAX + 10];
void dfs(int node, int parent)
{
    level[node] = level[parent] + 1;
    ancestor[0][node] = parent;
    for (const auto &next : graph[node])
        if (next != parent)
            dfs(next, node);
}
int LCA(int x, int y)
{
    if (level[x] < level[y])
        swap(x, y);
    int diff = level[x] - level[y];
    for (int p = LOG; p >= 0; p--)
        if ((diff >> p) & 1)
            x = ancestor[p][x];
    if (x == y)
        return x;
    for (int p = LOG; p >= 0; p--)
        if (ancestor[p][x] != ancestor[p][y] && ancestor[p][x] != 0 && ancestor[p][y] != 0)
        {
            x = ancestor[p][x];
            y = ancestor[p][y];
        }
    return ancestor[0][x];
}
int main()
{
    int n, q;
    cin >> n >> q;
    for (int i = 2; i <= n; i++)
    {
        int dad;
        cin >> dad;
        graph[i].push_back(dad);
        graph[dad].push_back(i);
    }
    dfs(1, 0);
    for (int p = 1; p <= LOG; p++)
        for (int node = 1; node <= n; node++)
            ancestor[p][node] = ancestor[p - 1][ancestor[p - 1][node]];
    for (int i = 1; i <= q; i++)
    {
        int x, y;
        cin >> x >> y;
        cout << LCA(x, y) << '\n';
    }
    return 0;
}