Cod sursa(job #3002679)

Utilizator Mihai7218Bratu Mihai-Alexandru Mihai7218 Data 14 martie 2023 23:38:17
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <vector>
#include <map>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, i, j, q, qi, x, y, lg[500001], rmq[31][500001];
vector <vector <int> > arb;
vector <int> parc, euler, viz;
map <int, int> ap;
void dfs (int start, int lvl)
{
    parc.push_back(lvl);
    euler.push_back(start);
    viz[start] = 1;
    for (auto it : arb[start])
    {
        if (viz[it] == 0)
        {
            dfs (it, lvl+1);
            parc.push_back(lvl);
            euler.push_back(start);
        }
    }
}
int main()
{
    fin >> n >> q;
    arb.resize(n+1);
    viz.resize(n+1);
    for (i = 2; i <= n; i++)
    {
        fin >> x;
        arb[x].push_back(i);
        arb[i].push_back(x);
    }
    euler.push_back(0);
    parc.push_back(0);
    dfs (1, 0);
    for (i = 2; i <= euler.size(); i++)
        lg[i] = lg[i/2]+1;
    for (i = 0; i < parc.size(); i++)
    {
        if (ap.find(euler[i]) == ap.end())
            ap[euler[i]] = i;
        rmq[0][i] = i;
    }
    for (i = 1; i <= lg[euler.size()]; i++)
    {
        for (j = 0; j < euler.size(); j++)
        {
            if (parc[rmq[i-1][j]] <= parc[rmq[i-1][j+(1 << (i-1))]])
            {
                rmq[i][j] = rmq[i-1][j];
            }
            else
            {
                rmq[i][j] = rmq[i-1][j+(1 << (i-1))];
            }
        }
    }
    for (qi = 1; qi <= q; qi++)
    {
        fin >> x >> y;
        x = ap[x];
        y = ap[y];
        m = lg[y-x+1];
        int sol = 0;
        if (parc[rmq[m][x]] <= parc[rmq[m][y-(1 << m)+1]])
            sol = rmq[m][x];
        else
            sol = rmq[m][y-(1<<m)+1];
        fout << euler[sol] << '\n';
    }
    return 0;
}