Cod sursa(job #2870727)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 12 martie 2022 15:24:30
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const string filename = "lca";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

const int maxN = 100000;
int n, q, ind, depth[maxN + 5], poz[maxN + 5], e[2 * maxN + 5], rmq[20][2 * maxN + 5], log2[2 * maxN + 5];
vector <int> G[maxN + 5];

void dfs(int nod, int d)
{
    e[++ind] = nod;
    poz[nod] = ind;
    depth[nod] = d;
    for(int vecin : G[nod])
    {
        dfs(vecin, d + 1);
        e[++ind] = nod;
    }
}

bool cmp(int a, int b)
{
    if(depth[a] < depth[b])
        return 1;
    return 0;
}

void calc_rmq()
{
    for(int i = 2; i <= ind; i++)
        log2[i] = log2[i / 2] + 1;
    for(int i = 1; i <= ind; i++)
        rmq[0][i] = e[i];
    for(int j = 1; (1 << j) <= ind; j++)
        for(int i = 1; i + (1 << (j - 1)) <= ind; i++)
            rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))], cmp);
}

int lca(int a, int b)
{
    int st, dr, log, len, aux;
    st = min(poz[a], poz[b]);
    dr = max(poz[a], poz[b]);
    len = dr - st + 1;
    log = log2[len];
    aux = min(rmq[log][st], rmq[log][dr - (1 << log) + 1], cmp);
    return aux;
}

int main()
{
    fin >> n >> q;
    for(int i = 2; i <= n; i++)
    {
        int p;
        fin >> p;
        G[p].push_back(i);
    }
    dfs(1, 1);
    calc_rmq();
    for(int i = 1; i <= q; i++)
    {
        int x, y;
        fin >> x >> y;
        fout << lca(x, y) << '\n';
    }
    return 0;
}