Cod sursa(job #3200497)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 4 februarie 2024 20:51:49
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q, i, j, x, y;
int niv[100002], t[100002];
set<int> a[100002];

static inline void PrecalcNiv(int nod = 1, int level = 1) {
    niv[nod] = level;
    for(auto it : a[nod]) PrecalcNiv(it, level + 1);
}

static inline int Lca(int x, int y) {
    if(niv[x] < niv[y]) swap(x, y);
    while(niv[x] > niv[y]) x = t[x];
    while(x != y) {
        x = t[x];
        y = t[y];
    }
    return x;
}

int main() {
    fin >> n >> q;
    for(i = 2; i <= n; i++) {
        fin >> t[i];
        a[t[i]].insert(i);
    }

    PrecalcNiv();

    while(q--) {
        fin >> x >> y;
        fout << Lca(x, y) << "\n";
    }

    return 0;
}