Cod sursa(job #2587683)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 23 martie 2020 13:42:23
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#define NMAX 100005
#define CM2P (int)log2(2*NMAX) + 5
#define ilog(x) (int)log2(x)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

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



int firstAp[NMAX];
int n, m, rmq[CM2P][2*NMAX];
vector<int> euler;
vector<int> graph[NMAX];

void read()
{
    int x;
    f>>n>>m;
    for(int i = 2; i <= n; ++i)
    {
        f>>x;
        graph[x].push_back(i);
        graph[i].push_back(x);
    }
}

void formEuler(int nod, int t)
{
    firstAp[nod] = euler.size();
    euler.push_back(nod);
    for(auto &v:graph[nod])
        if(v != t)
        {
            formEuler(v, nod);
            euler.push_back(nod);
        }
}

void formRMQ()
{
    int nn = euler.size();
    for(int i = 0; i < nn; ++i)
    {
        rmq[0][i] = euler[i];
    }
    for(int i = 1; (1<<i) <= nn; ++i)
        for(int j = 0; j + (1<<i) < nn; ++j)
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + (1<<(i-1))]);

}

void solveQuery()
{
    int x, y;
    for(int i = 1; i <= m; ++i)
    {
        f>>x>>y;
        int fx = firstAp[x], fy = firstAp[y];

        if(fx > fy) swap(fx, fy);
        int val = ilog(fy - fx + 1);
        g<<min(rmq[val][fx], rmq[val][fy - (1<<val) + 1])<<'\n';
    }
}

int main()
{
    read();
    formEuler(1, 1);
    formRMQ();
    solveQuery();
    return 0;
}