Cod sursa(job #2205642)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 19 mai 2018 18:32:52
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 100001;
int N, M;
int euler[2 * NMAX], K, poz[2 * NMAX], niv[NMAX];
int log[NMAX], rmq[NMAX][18];
vector<int> G[NMAX];

void DFS (int x, int lev)
{
    niv[x] = lev;
    euler[++K] = x;
    poz[x] = K;
    for (auto it : G[x])
    {
        DFS (it, lev + 1);
        euler[++K] = x;
    }
}
int RMQ ()
{
    for(int i = 1; i <= K; i++)
        rmq[i][0] = i;
    for (int j = 1; (1 << j) <= K; j++)
        for (int i = 0; i + (1 << j) - 1 <= K; i++)
            if (euler[rmq[i][j - 1]] <= euler[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];
}
int minim (int st, int dr)
{
    int d = log[dr - st + 1];
    int sol = rmq[st][d];
    if (euler[sol] > euler[rmq[dr - (1 << d) + 1][d]])
        sol = rmq[dr - (1 << d) + 1][d];
    return euler[sol];
}
int lca (int x, int y)
{
    int st = poz[x], dr = poz[y];
    if (st > dr)
        swap (st, dr);
    return minim (st, dr);
}
int main()
{
    f >> N >> M;
    int x, y;
    for (int i = 2; i <= N; i++)
    {
        f >> x;
        G[x].push_back (i);
    }
    DFS (1, 0);
    log[1] = 0;
    for (int i = 2; i <= N; i++)
        log[i] = log[i / 2] + 1;
    RMQ();
    for (int i = 1; i <= M; i++)
    {
        f >> x >> y;
        g << lca (x, y) << '\n';
    }
    return 0;
}