Cod sursa(job #2806144)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 13:32:39
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#define N 100002
#include <fstream>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

vector <int> graph[N];
int rmq[20][3 * N], log[3 * N], nr;
int niv[N], first[N];
bool viz[N];

void eul(int nod)
{
    rmq[0][++nr] = nod;
    first[nod] = nr;
    viz[nod] = 1;
    for (int i = 0;i < graph[nod].size();++i)
    {
        int vee = graph[nod][i];
        if (!viz[vee])
        {
            niv[vee] = niv[nod] + 1;
            eul(vee);
            rmq[0][++nr] = nod;
        }
    }
}
int main()
{
    int n, m, x;
    f >> n >> m;
    for (int i = 1;i < n;++i)
    {
        f >> x;
        graph[x].push_back(i + 1);
    }
    eul(1);
    log[0] = -1;
    for (int i = 1;i <= nr;++i) log[i] = 1 + log[i / 2];
    int p = 1;
    for (int i = 1;i <= log[nr];++i)
    {
        for (int j = 1;j + p <= nr;++j)
        {
            int n1 = rmq[i - 1][j], n2 = rmq[i - 1][j + p];
            if (niv[n1] > niv[n2]) rmq[i][j] = n2;
            else rmq[i][j] = n1;
        }
        p *= 2;
    }
    int a, b, dif, lin, sol;
    while (m--)
    {
        f >> a >> b;
        a = first[a];
        b = first[b];
        if (a > b) swap(a, b);
        dif = b - a + 1;
        lin = log[dif];
        p = (1 << lin);
        int n1 = rmq[lin][a], n2 = rmq[lin][b - p + 1];
        if (niv[n1] > niv[n2]) sol = n2;
        else sol = n1;
        g << sol << '\n';
    }
    f.close();
    g.close();
    return 0;
}