Cod sursa(job #2205622)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 19 mai 2018 17:25:31
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>

using namespace std;

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

const int NMAX = 100001;
int N, M;
int T[18][NMAX], niv[NMAX];
vector<int> G[NMAX];

void precalcul()
{
    for (int k = 1; (1 << k) <= N; k++)
        for (int i = 1; i <= N; i++)
            T[k][i] = T[k - 1][T[k - 1][i]];
}
void DFS (int x, int lev)
{
    niv[x] = lev;
    for (auto it : G[x])
        DFS (it, lev + 1);
}
int lca (int x, int y)
{
    int logx, logy;
    if (niv[x] < niv[y])
        swap (x, y);
    logx = ceil (log2 (niv[x]) );
    logy = ceil (log2 (niv[y]) );
    //aducem nodul x pe nivel cu y
    for (int k = logx; k >= 0 && niv[x] != niv[y]; k--)
        if (niv[x] - (1 << k) >= niv[y])
            x = T[k][x];
    //cautam lca
    if (x == y)
        return x;
    for (int k = logy; k >= 0; k--)
        if (T[k][x] && T[k][x] != T[k][y])
        {
            x = T[k][x];
            y = T[k][y];
        }
    return T[0][x];
}
int main()
{
    f >> N >> M;
    for (int i = 2; i <= N; i++)
    {
        f >> T[0][i];
        G[T[0][i]].push_back (i);
    }
    precalcul();
    DFS(1, 0);
    int x, y;
    for (int i = 1; i <= M; i++)
    {
        f >> x >> y;
        g << lca (x, y) << '\n';
    }
    return 0;
}