Cod sursa(job #3139794)

Utilizator Mihai_PopescuMihai Popescu Mihai_Popescu Data 1 iulie 2023 18:11:42
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 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)
        {
            int log = 0;

            while (dp[log][u] != dp[log][v])
                log++;

            u = dp[log][u];
            v = dp[log][v];
        }

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