Cod sursa(job #2086674)

Utilizator TherevengerkingSurani Adrian Therevengerking Data 12 decembrie 2017 12:41:02
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define pb push_back
const int Nmax = 100000 + 5;
const int Mmax = 400000 + 5;
int n, m, k, el[Mmax], poz[Mmax], lg[Mmax], rmq[30][Mmax], g[Mmax], rmqp[30][Mmax];
vector<int>v[Mmax];
void dfs(int nod)
{
    el[++k] = nod;
    poz[nod] = k;
    for(auto i : v[nod])
    {
        g[i] = g[nod] + 1;
        dfs(i);
        el[++k] = nod;
    }
    if(v[nod].size() == 0)el[++k] = nod;
}
int main()
{
    fin >> n >> m;
    for(int i = 1, a; i < n; ++i)
    {
        fin >> a;
        v[a].pb(i + 1);
    }
    g[1] = 1;
    dfs(1);
    for(int l = 2; l <= k; ++l)
        lg[l] = lg[l / 2] + 1;
    for(int i = 1; i <= k; ++i)
    {
        rmq[0][i] = g[el[i]];
        rmqp[0][i] = el[i];
    }
    for(int l = 1; l <= lg[k]; ++l)
        for(int i = 1; i + (1 << l) - 1 <= k; ++i)
        {
            if(rmq[l - 1][i] > rmq[l - 1][i + (1 << (l - 1))])
            {
                rmq[l][i] = rmq[l - 1][i + (1 << (l - 1))];
                rmqp[l][i] = rmqp[l - 1][i + (1 << (l - 1))];
            }
            else
            {
                rmq[l][i] = rmq[l - 1][i];
                rmqp[l][i] = rmqp[l - 1][i];
            }
        }
    for(int i = 1, a, b, l, lung, x, y; i <= m; ++i)
    {
        fin >> a >> b;
        x = poz[a]; y = poz[b];
        if(x > y)swap(x, y);
        lung = y - x + 1;
        l = lg[lung];
        if(rmq[l][x] < rmq[l][y - (1 << l) + 1])
            fout << rmqp[l][x] << '\n';
        else
            fout << rmqp[l][y - (1 << l) + 1] << '\n';
    }
    return 0;
}