Cod sursa(job #3225152)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 16 aprilie 2024 22:29:21
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include<bits/stdc++.h>

std::ifstream fin("lca.in");
std::ofstream fout("lca.out");

struct elem{
    int info, niv;
};
const int MAX = 1e5 + 5;
const int LOG_MAX = 18;
elem rmq[LOG_MAX][2 * MAX];
std::vector<int> G[MAX];
int E[2 * MAX], poz[2 * MAX];
int n, m, x, y, cnt;

void DFS(int start, int niv){
    rmq[0][++cnt] = (elem){start, niv};
    poz[start] = cnt;
    for(const int& x : G[start]){
        DFS(x, niv + 1);
        rmq[0][++cnt] = (elem){start, niv};
    }
}

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

    DFS(1, 1);

    for(int i = 1; (1 << i) <= cnt; ++i)
    for(int j = 1; j <= cnt; ++j){
        rmq[i][j] = rmq[i - 1][j];
        int val = j + (1 << (i - 1));
        if(val <= cnt and rmq[i - 1][val].niv < rmq[i][j].niv)
            rmq[i][j] = rmq[i - 1][val];
    }

    E[1] = 0;
    for(int i = 2; i <= cnt; ++i)
        E[i] = 1 + E[i / 2];

    for(;m;--m){
        fin >> x >> y;
        x = poz[x];
        y = poz[y];
        if(x > y)
            std::swap(x, y);
        int len = y - x + 1, e = E[len];
        if(rmq[e][x].niv > rmq[e][y - (1 << e) + 1].niv)
            fout << rmq[e][y - (1 << e) + 1].info << '\n';
        else
            fout << rmq[e][x].info << '\n';
    }
}