Cod sursa(job #2975825)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 7 februarie 2023 17:37:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;
#define cin fin
#define cout fout
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<vector<int>> ad,rmq;
const int nmx = 1e5 + 1;
const int lvlmx = 24;
int in[nmx],h[nmx];
int t;

void dfs(int k,int hg){
    h[k] = hg;
    rmq[0].push_back(k);
    in[k] = rmq[0].size()-1;
    for(int to : ad[k]){
        dfs(to,hg+1);
        rmq[0].push_back(k);
    }
}

int main(){
    int n,m;
    cin >> n >> m;
    t = 0;
    ad = vector<vector<int>>(n+1);
    rmq = vector<vector<int>>(lvlmx);
    for(int i=2;i<=n;i++){
        int x;
        cin >> x;
        ad[x].push_back(i);
    }

    dfs(1,0);


    int sz = rmq[0].size();
    for(int k=1;(1<<k)<sz;k++){
        for(int i=0;i<sz-(1<<k)+1;i++){
            if(h[rmq[k-1][i]] < h[rmq[k-1][i+(1<<k-1)]])
                rmq[k].push_back(rmq[k-1][i]);
            else
                rmq[k].push_back(rmq[k-1][i+(1<<k-1)]);
        }
    }
    while(m--){
        int u,v;
        cin >> u >> v;
        int k = 0;
        int i = in[u], j = in[v];
        if(i>j)
            swap(i,j);
        int len = j-i+1;
        while((1<<k+1)<len)
            k++;
        if(h[rmq[k][i]] < h[rmq[k][j-(1<<k)+1]])
            cout << rmq[k][i] << "\n";
        else
            cout << rmq[k][j-(1<<k)+1] << "\n";
    }
}