Cod sursa(job #3139106)

Utilizator Mihai_PopescuMihai Popescu Mihai_Popescu Data 25 iunie 2023 10:31:08
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
using namespace std;

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

#define NMAX 100005

int dp[20][NMAX];
int nivel[NMAX];

int str(int nod, int ordin)
{
    int i = 0;
    while (ordin)
    {
        if (ordin % 2)
            nod = dp[i][nod];
        i++;
        ordin /= 2;
    }
    return nod;
}

int main()
{
    int n, m;
    fin >> n >> m;

    for (int i = 2; i <= n; ++i)
        fin >> dp[0][i];

    for (int i = 1; (1 << i) <= n; ++i)
        for (int j = 1; j <= n; ++j)
            if (dp[i - 1][j])
                dp[i][j] = dp[i - 1][dp[i - 1][j]];

    for (int i = 2; i <= n; ++i)
        nivel[i] = nivel[dp[0][i]] + 1;

    for (int i = 1; i <= m; ++i)
    {
        int u, v;
        fin >> u >> v;

        if (nivel[u] < nivel[v])
        {
            int aux = u;
            u = v;
            v = aux;
        }

        int dif = nivel[u] - nivel[v];

        u = str(u, dif);

        while (u != v)
        {
            u = str(u, 1);
            v = str(v, 1);
        }

        fout << u << '\n';
    }
    return 0;
}