Cod sursa(job #2170099)

Utilizator vlad6001Pintilie Vlad vlad6001 Data 14 martie 2018 22:23:12
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int radacina, niv[100004], nr, intrebari, tata, k;
int LCA[100004][22], a, b, multiplu;

vector <int> lista[100004];

void bfs(int nod, int nivel)
{
    niv[nod] = nivel;
    int lg = lista[nod].size();
    //cout << lista[nod].size() << ' ';
    for(int i=0; i < lg; i++)
    {
        //cout << lista[nod][i] << ' ';
        bfs(lista[nod][i], nivel+1);
    }
}

int main()
{
    fin >> nr >> intrebari;
    for(int i=2; i <= nr; i++)
    {
        fin >> tata;
        LCA[i][0] = tata;
        lista[tata].push_back(i);
    }

    radacina = 1;
    bfs(radacina, 1);
    //for(int i=1; i <= nr; i++)
    //fout << niv[i] << ' ';

    k = log2(nr);
    for(int j=1; j <= k; j++)
    {
        for(int i=1; i <= nr; i++)
        LCA[i][j] = LCA[LCA[i][j-1]][j-1];
    }

    for(int yy=1; yy <= intrebari; yy++)
    {
        fin >> a >> b;
        if(niv[a] < niv[b])
        swap(a,b);
        //niv[a] >= niv[b]
        multiplu = 1;
        for(int i=1; i <= 20; i++)
        multiplu *= 2;
        for(int i=20; i >= 0; i--)
        {
            if(niv[a]-multiplu >= niv[b])
            a = LCA[a][i];

            multiplu /= 2;
        }
        multiplu = 1;
        for(int i=1; i <= 20; i++)
        multiplu *= 2;
        for(int i=20; i >= 0; i--)
        {
            if(LCA[a][i] != LCA[b][i])
            {
                a = LCA[a][i];
                b = LCA[b][i];
            }
        }
        if(a != b)
        fout << LCA[a][0] << '\n';
        else
        fout << a << '\n';
    }
}