Cod sursa(job #3273374)

Utilizator Shaan_StefanShaan Stefan Shaan_Stefan Data 1 februarie 2025 21:03:17
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <ctgmath>
#include <vector>

#define NMAX 100000

using namespace std;
int n, q, x, y, k = 0;
int rmq[20][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 = (height[rmq[p2][x]] < height[rmq[p2][y - (1 << p2) + 1]] ? rmq[p2][x] : 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++)
        for(int j = 1; j <= k - (1 << i) + 1; j++)
            rmq[i][j] = (height[rmq[i - 1][j]] < height[rmq[i - 1][j + (1 << (i - 1))]] ? rmq[i - 1][j] : rmq[i - 1][j + (1 << (i - 1))]);    

    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;
}