Cod sursa(job #2715533)

Utilizator bem.andreiIceman bem.andrei Data 3 martie 2021 19:53:14
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("lca.in");
ofstream w("lca.out");
int prima[400003], rmq[20][400003];
vector<int> g[100003];
vector<pair<int, int>>e;
void dfs(int nod, int niv){
    if(nod!=1 && prima[nod]==0){
        prima[nod]=e.size();
    }
    e.push_back(make_pair(nod, niv));
    for(auto it: g[nod]){
        dfs(it, niv+1);
        e.push_back(make_pair(nod, niv));
    }
}
void init(){
    int cnt=e.size();
    for(int i = 1; i <= cnt; i++) {
        rmq[0][i] = i;
    }
    for(int i = 1; (1 << i) <= cnt; i++) {
        for(int j = 1; j + (1 << i) <= cnt; j++) {
            if(e[rmq[i - 1][j]].second<= e[rmq[i - 1][j + (1 << (i - 1))]].second) {
                rmq[i][j] = rmq[i - 1][j];
            }
            else {
                rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
            }
        }
    }
}
int querry(int st, int dr){
    int line, skip, ans;
    skip = dr - st + 1;
    line = log2(skip);
    if(e[rmq[line][st]].second<= e[rmq[line][st + skip - (1 << line)]].second) {
        ans = rmq[line][st];
    }
    else {
        ans = rmq[line][st + skip - (1 << line)];
    }
    return e[ans].first;
}
int main()
{
    int n, m;
    r>>n>>m;
    for(int i=2;i<=n;i++){
        int x;
        r>>x;
        g[x].push_back(i);
    }
    dfs(1, 0);
    init();
    for(int i=0;i<m;i++){
        int a, b;
        r>>a>>b;
        if(prima[a]>prima[b]){
            swap(a, b);
        }
        w<<querry(prima[a], prima[b])<<"\n";
    }
    return 0;
}