Cod sursa(job #2476433)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 18 octombrie 2019 20:47:27
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 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() {
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    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;
        for(lg = 20; BIT(lg) > pb - pa + 1; 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;
}