Cod sursa(job #1668887)

Utilizator crysstyanIacob Paul Cristian crysstyan Data 30 martie 2016 09:56:57
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <stack>
#define NMAX 100005
#define LMAX (int) log2(NMAX) + 5

using namespace std;

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

int i, n, x, y, level[2 * NMAX], euler[2 * NMAX], cont = 0, nrquiz, pos[NMAX], cnt = 0, rmq[2 * NMAX][LMAX], j;
vector < int > v[NMAX];
bool visited[NMAX];

void DFS(int node, int lvl)
{
    cont ++;
    level[cont] = lvl;
    euler[cont] = node;
    visited[node] = 1;

    pos[node] = cont;

    for (auto & it : v[node])
        if (!visited[it])
        {
            DFS(it, lvl + 1);
            cont ++;
            level[cont] = lvl;
            euler[cont] = node;
        }
}

int main()
{
    f >> n >> nrquiz;

    for (i = 2; i <= n; ++ i)
    {
        f >> x;
        v[i].push_back(x);
        v[x].push_back(i);
    }

    DFS(1, 0);

    for (i = 1; i <= cont; ++ i)
        rmq[i][0] = i;

    for (j = 1; (1 << j) <= cont; ++ j)
        for (i = 1; i + (1 << j) - 1 <= cont; ++ i)
            if (level[rmq[i][j - 1]] < level[rmq[i + (1 << (j - 1))][j - 1]])
                rmq[i][j] = rmq[i][j - 1];
            else
                rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];

    for (; nrquiz; -- nrquiz)
    {
        f >> x >> y;

        int st = min(pos[x], pos[y]);
        int dr = max(pos[x], pos[y]);

        int l = log2(dr - st + 1);

        if (level[rmq[st][l]] < level[rmq[dr - (1 << l) + 1][l]])
            g << euler[rmq[st][l]] << '\n';
        else
            g << euler[rmq[dr - (1 << l) + 1][l]] << '\n';
    }
    return 0;
}