Cod sursa(job #3145112)

Utilizator AdiFBubuBubuianu Adrian AdiFBubu Data 12 august 2023 20:05:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

#define NMAX 100005

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

int n, m, nod, k, x, y;
vector <int> G[NMAX];
int H[NMAX * 2], First[NMAX], L[NMAX * 2];
int rmq[NMAX * 2][19];
int lg[NMAX * 2];

void dfs(int nod, int lev)
{
    H[++ k] = nod;
    L[k] = lev;
    First[nod] = k;

    for(vector <int>::iterator it = G[nod].begin(); it != G[nod].end(); it ++)
    {
        dfs(*it, lev + 1);

        H[++ k] = nod;
        L[k] = lev;
    }
}

void process2()
{
    for(int i = 1; i <= k; i ++)
        rmq[i][0] = i;
    for(int j = 1; (1 << j) <= k; j ++)
        for(int i = 1; i + (1 << j) - 1 <= k; i ++)
            if(L[ rmq[i][j - 1] ] < L[ rmq[i + (1 <<  (j - 1) ) ][j - 1] ])
                rmq[i][j] = rmq[i][j - 1];
            else
                rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
}

int main()
{
    f >> n >> m;
    for(int i = 2; i <= n; i ++)
    {
        f >> nod;
        G[nod].push_back(i);
    }

    lg[1] = 0;
    for(int i = 2; i <= n * 2; i ++)
        lg[i] = lg[i / 2] + 1;

    dfs(1, 0);

    process2();

    for(int i = 1; i <= m; i ++)
    {
        f >> x >> y;
        x = First[x], y = First[y];
        if(x > y)
            swap(x, y);
        int l = lg[y - x + 1];
        int val;
        if(L[ rmq[x][l] ] < L[ rmq[y - (1 << l) + 1][l] ] )
            val = rmq[x][l];
        else
            val = rmq[y - (1 << l) + 1][l];
        g << H[val] << '\n';
    }
    return 0;
}