Cod sursa(job #3141610)

Utilizator ana_valeriaAna Valeria Duguleanu ana_valeria Data 14 iulie 2023 20:15:33
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#define MAX 100000
#define LOG 20
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
vector <int> graph[MAX + 10];
int level[MAX + 10], ancestor[LOG + 10][MAX + 10];
void dfs(int node, int parent)
{
    level[node] = level[parent] + 1;
    ancestor[0][node] = parent;
    for (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] != 0 && ancestor[p][y] != 0 && ancestor[p][x] != ancestor[p][y])
        {
            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 x;
        cin >> x;
        graph[x].push_back(i);
        graph[i].push_back(x);
    }
    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;
}