Cod sursa(job #3308895)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 29 august 2025 15:06:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

vector<int> child[100005];
int h[100005];
int euler[200005];
int firstpoz[100005], lg[200005];
pair<int, int> rmq[18][200005];
int currt;

void dfs(int u) {
    euler[++currt] = u;
    firstpoz[u] = currt;
    for (int v : child[u]) {
        dfs(v);
        euler[++currt] = u;
    }
}

void get_rmq(int n) {
    for (int i = 1; i <= n; i++) {
        rmq[0][i] = {h[euler[i]], euler[i]};
    }
    for (int b = 1; (1 << b) <= n; b++) {
        for (int i = 1; i + (1 << b) - 1 <= n; i++) {
            rmq[b][i] = min(rmq[b - 1][i], rmq[b - 1][i + (1 << (b - 1))]);
        }
    }
}

int solve(int l, int r) {
    int lglen = lg[r - l + 1];
    if (rmq[lglen][l].first < rmq[lglen][r - (1 << lglen) + 1].first) {
        return rmq[lglen][l].second;
    }
    return rmq[lglen][r - (1 << lglen) + 1].second;
}

int main() {

    ifstream cin("lca.in");
    ofstream cout("lca.out");

    for (int i = 2; i <= 200000; i++) {
        lg[i] = lg[i / 2] + 1;
    }
    int n, q;
    cin >> n >> q;
    h[1] = 1;
    for (int i = 2; i <= n; i++) {
        int a;
        cin >> a;
        child[a].push_back(i);
        h[i] = h[a] + 1;
    }
    dfs(1);
    get_rmq(currt);
    while (q--) {
        int u, v;
        cin >> u >> v;
        cout << solve(min(firstpoz[u], firstpoz[v]), max(firstpoz[u], firstpoz[v])) << '\n';
    }
    return 0;
}