Cod sursa(job #3136958)

Utilizator matei.tudoseMatei Tudose matei.tudose Data 9 iunie 2023 16:58:26
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

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

int n, q, stramosi[19][100005], adancimi[100005];
vector<int> G[100005];

void precalc()
{
    int log = log2(n);
    for (int i = 1; i <= log; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            stramosi[i][j] = stramosi[i - 1][stramosi[i - 1][j]];
            if (stramosi[i-1][j] == 0)
                continue;
        }
    }
}

void DFS(int nod, int adancime)
{
    adancimi[nod] = adancime;
    for (int i = 0; i < G[nod].size(); i++)
    {
        int vecin = G[nod][i];
        if (adancimi[vecin] == 0)
        {
            DFS(vecin, adancime + 1);
            stramosi[0][vecin] = nod;
        }
    }
}

void lca(int x, int y)
{
    if (adancimi[x] > adancimi[y])
        swap(x, y);
    int d = adancimi[y] - adancimi[x];
    for (int i = log2(n); i >= 0; i--)
    {
        if (d & (1 << i))
        {
            d -= i;
            y = stramosi[i][y];
        }
    }
    if (x != y)
    {
        for (int i = log2(n); i >= 0; i--)
        {
            if (stramosi[i][x] != stramosi[i][y])
            {
                x = stramosi[i][x];
                y = stramosi[i][y];
            }
        }
    }
    fout << stramosi[0][x] << '\n';
}

int main()
{
    fin >> n >> q;
    for (int i = 2; i <= n; i++)
    {
        int x;
        fin >> x;
        G[x].push_back(i);
        G[i].push_back(x);
    }
    DFS(1, 1);
    precalc();
    for (int i = 1; i <= q; i++)
    {
        int x, y;
        fin >> x >> y;
        lca(x, y);
    }
    return 0;
}