Cod sursa(job #2476439)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 18 octombrie 2019 20:59:00
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
#define BIT(x) (1<<(x))

using namespace std;

struct El
{
    El() {}
    El(int h, int n) : h(h), n(n) {}
    int h, n;
} rmq[20][200020];

vector<int> g[100010];
int pos[100010];

int lrmq;

void dfs(int n, int h)
{
    pos[n] = lrmq;
    rmq[0][lrmq++] = El(h, n);
    for(int v : g[n])
    {
        dfs(v, h + 1);
        rmq[0][lrmq++] = El(h, n);
    }
}

int main() {
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    int n, q;
    cin >> n >> q;
    for(int i = 2; i <= n; i++)
    {
        int t;
        cin >> t;
        g[t].push_back(i);
    }
    dfs(1, 0);

    for(int k = 1; lrmq - BIT(k) + 1 >= 0; k++)
    {
        for(int i = 0; i < lrmq - BIT(k) + 1; i++)
        {
            if(rmq[k - 1][i].h < rmq[k - 1][i + BIT(k - 1)].h)
                rmq[k][i] = rmq[k - 1][i];
            else rmq[k][i] = rmq[k - 1][i + BIT(k - 1)];
        }
    }

    while(q--)
    {
        int a, b;
        cin >> a >> b;

        int pa = pos[a];
        int pb = pos[b];
        if(pa > pb)
            swap(pa, pb);

        int lg;
        int diff = pb - pa + 1;
        for(lg = 20; BIT(lg) > diff; lg--);
        El& ea = rmq[lg][pa];
        El& eb = rmq[lg][pb - BIT(lg) + 1];
        if(ea.h < eb.h)
            cout << ea.n << '\n';
        else cout << eb.n << '\n';
    }

    return 0;
}