Cod sursa(job #3271346)

Utilizator GabyXBBabiuc Eduard Gabriel GabyXB Data 25 ianuarie 2025 19:16:53
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

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

vector<int> G[100002];

int m[17][100002];
int parcurgere[400003];
int n , q;
int fa[100002];
int hn[100002];
bool u[100002];
int len;

void citire()
{
    int x , y;
    cin >> n >> q ;
    for(int i = 2  ; i<=n ; i++)
    {
        cin >> x ;
        G[i].push_back(x);
        G[x].push_back(i);
    }
}

void build_table()
{
    for(int i = 1; (1<<i) < len ; i++)
        for(int j = 1 ; j + (1<<i) - 1 <=len ; j++)
            {
                if(hn[m[i-1][j]] < hn[m[i-1][j+(1<<(i-1))]])
                    m[i][j] = m[i-1][j];
                else m[i][j] = m[i-1][j+(1<<(i-1))];
            }
}

void afisare()
{
    cout << '\n';
    for(int i = 0; (1<<i) < len ; i++ , cout << '\n')
        for(int j = 1 ; j + (1<<i) - 1 <=len ; j++)
            cout << m[i][j] << ' ';
    cout << '\n';
}

int query(int x , int y)
{
    int log = 31-__builtin_clz(y-x+1);
    return min(m[log][x] , m[log][y-(1<<log) + 1]);
}

void dfs(int nod , int h = 1)
{
    m[0][++len] = nod;
    u[nod] = 1;
    hn[nod] = h;
    fa[nod] = len;
    for(int i = 0 ; i<G[nod].size() ; i++)
        if(!u[G[nod][i]])
        {
            dfs(G[nod][i],h+1);
            m[0][++len] = nod;
        }
}

int main()
{
    citire();
    dfs(1);
    build_table();
    int x , y;
    while(q--)
    {
        cin >> x >> y;
        if(fa[x] < fa[y])
            cout << query(fa[x] , fa[y]) << '\n';
        else cout << query(fa[y] , fa[x]) << '\n';
    }
}