Cod sursa(job #3144663)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 9 august 2023 16:50:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

const int Nmax = 100005;

int poz;
int euclid[Nmax];
pair<int, int> rmq[35][2 * Nmax];
vector<int> arbore[Nmax];

void dfs(int nod, int tata, int nivel){
    if(euclid[nod] == 0){
        euclid[nod] = poz;
    }

    rmq[0][poz].first = nivel;
    rmq[0][poz].second = nod;
    poz++;

    for(int fiu : arbore[nod]){
        if(fiu != tata){
            dfs(fiu, nod, nivel + 1);
            rmq[0][poz].first = nivel;
            rmq[0][poz].second = nod;
            poz++;
        }
    }
}

int main(){
    ifstream fin("lca.in");
    ofstream fout("lca.out");

    int n, m, x, a, b;
    pair<int, int> p;

    fin >> n >> m;

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

    poz = 1;
    dfs(1, 0, 0);

    for(int len = 1; (1 << len) <= poz; len++){
        for(int i = 1; i <= poz - (1 << len) + 1; i++){
            rmq[len][i] = min(rmq[len - 1][i], rmq[len - 1][i + (1 << (len - 1))]);
        }
    }

    while(m--){
        fin >> a >> b;

        a = euclid[a];
        b = euclid[b];

        if(a > b){
            swap(a, b);
        }

        x = log2(b - a + 1);

        p = min(rmq[x][a], rmq[x][b - (1 << x) + 1]);

        fout << p.second << '\n';
    }

    return 0;
}