Cod sursa(job #3003704)

Utilizator brianna_enacheEnache Brianna brianna_enache Data 15 martie 2023 21:17:49
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("lca.in");
ofstream out("lca.out");

vector <int> a[100005];
int rmq[21][100005], lg[100005];
int n, m, e[2000005], poz[100005], niv[2000005], k;

void DFS(int x, int nivel)
{
    e[++k] = x;
    niv[k] = nivel;
    poz[x] = k;
    for(auto w : a[x])
    {
        DFS(w, nivel + 1);
        e[++k] = x;
        niv[k] = nivel;
    }
}
int main()
{
    int i, j, x, y, exp;
    in >> n >> m;
    for(i = 2; i <= n; i++)
    {
        in >> x;
        a[x].push_back(i);
    }
    DFS(1, 1);
    for(i = 1; i <= k; i++)
        rmq[0][i] = i;
    lg[1] = 0;
    for(i = 2; i <= k; i++)
        lg[i] = lg[i/2] + 1;

    for(i = 1; i <= lg[k]; i++)
        for(j = 1; j <= k - (1 << i) + 1; j++)
        {
            rmq[i][j] = rmq[i - 1][j];
            if(niv[rmq[i - 1][j]] > niv[rmq[i - 1][j + (1 << (i - 1))]])
               rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
        }
    while(m--)
    {
        in >> x >> y;
        x = poz[x];
        y = poz[y];
        if(x > y) swap(x, y);
        exp = lg[y - x + 1];
        if(niv[rmq[exp][x]] > niv[rmq[exp][y - (1 << exp) + 1]])
            out << e[rmq[exp][y - (1 << exp) + 1]] << "\n";
            else out << e[rmq[exp][x]] << "\n";
    }
    return 0;
}