Cod sursa(job #3273222)

Utilizator Shaan_StefanShaan Stefan Shaan_Stefan Data 1 februarie 2025 11:41:49
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <ctgmath>
#include <vector>

#define NMAX 100000

using namespace std;
int n, q, x, y, k = 0;
int rmq[17][2 * NMAX + 2];
int pma[NMAX + 2];
vector<int> adc[NMAX + 2];

int height[NMAX + 2];

void dfse(int v, int h)
{
    rmq[0][++k] = v;
    pma[v] = k; 
    height[v] = h;
    for(auto it : adc[v])
    {
        dfse(it, h+1);
        rmq[0][++k] = v;
    }
}

int rmqPr(int x, int y)
{
    if(x > y)
        swap(x, y);
    int sz = y - x + 1;
    int p2 = int(log2(sz));

    int rez = rmq[p2][x];
    if(height[rez] > height[rmq[p2][y - (1 << p2) + 1]])
        rez = rmq[p2][y - (1 << p2) + 1];

    return rez;
}

int main()
{
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);

    scanf("%d %d", &n, &q);
    
    for(int i = 2; i <= n; i++)
    {
        scanf("%d", &x);
        adc[x].push_back(i);
    }

    dfse(1, 0);

    int lgb = int(log2(k));
    for(int i = 1; i <= lgb; i++)
    {
        int step = (1 << i);
        for(int j = 1; j + step <= k; j++)
        {
            rmq[i][j] = rmq[i - 1][j];
            if(height[rmq[i][j]] > height[rmq[i-1][j+1]])
                rmq[i][j] = rmq[i - 1][j + 1]; //lol
            
        }
    }

    for(int i = 1; i <= q; i++)
    {
        scanf("%d %d", &x, &y);

        int res = rmqPr(pma[x], pma[y]);
        printf("%d\n", res);
    }

    return 0;
}