Cod sursa(job #2272676)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 30 octombrie 2018 16:06:08
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <map>

using namespace std;

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

int N, M, x, y, val, _log[200003], D[21][200003], apar[200003];
vector<int> G[100003];
vector<int> euler, lv;
void df_euler(int nod, int nivel)
{
    if(!apar[nod])
    {
        euler.push_back(nod);
        lv.push_back(nivel);
        apar[nod] = euler.size() - 1;
        for(auto val: G[nod])
        {
            df_euler(val, nivel + 1);
            euler.push_back(nod);
            lv.push_back(nivel);
        }
    }

}
int main()
{
    f >> N >> M;
    for(int i = 2; i <= N; i++)
    {
        f >> x;
        G[x].push_back(i);
    }
    euler.push_back(0);
    lv.push_back(0);
    df_euler(1, 1);
    _log[0] = -1;
    int n = euler.size() - 1;
    for(int i = 1; i <= n; i++)
        _log[i] = _log[i / 2] + 1, D[0][i] = i;
    for(int i = 1; i <= _log[n]; i++)
    {
        for(int j = 1; j <= n - (1 << i) + 1; j++)
        {
            if(lv[D[i - 1][j]] < lv[D[i - 1][j + (1 << i - 1)]])
                D[i][j] = D[i - 1][j];
            else
                D[i][j] = D[i - 1][j + (1 << i - 1)];
        }

    }
    for(int i = 1; i <= M; i++)
    {
        f >> x >> y;
        int x1 = apar[x], x2 = apar[y];
        if(x1 == x2)
            g << euler[x1] << "\n";
        else {
        if(x1 > x2) swap(x1, x2);
        int k = _log[x2 - x1];
        if(lv[D[k][x1]] < lv[D[k][x2 - (1 << k) + 1]])
            g << euler[D[k][x1]] << "\n";
        else
            g << euler[D[k][x2 - (1 << k) + 1]] << "\n";
        }
    }
    return 0;
}