Cod sursa(job #3308888)

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

using namespace std;

vector<int> child[100005];
vector<pair<int, int>> queries[100005];
int par[100005], siz[100005], viz[100005], ancestor[100005];
int ans[2000005];

int find(int u) {
    if (u == par[u]) return u;
    return par[u] = find(par[u]);
}

void unite(int u, int v) {
    u = find(u);
    v = find(v);
    if (siz[u] > siz[v])
        swap(u, v);
    par[u] = v;
    siz[v] += siz[u];
}

void dfs(int u) {
    viz[u] = 1;
    ancestor[u] = u;
    for (int v : child[u]) {
        dfs(v);
        unite(u, v);
        ancestor[find(u)] = u;
    }
    for (auto [v, id] : queries[u]) {
        if (viz[v]) {
            ans[id] = ancestor[find(v)];
        }
    }
}

int main() {

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

    int n, q;
    cin >> n >> q;
    par[1] = 1;
    siz[1] = 1;
    for (int i = 2; i <= n; i++) {
        par[i] = i;
        siz[i] = 1;
        int x;
        cin >> x;
        child[x].push_back(i);
    }
    for (int i = 1; i <= q; i++) {
        int u, v;
        cin >> u >> v;
        queries[u].push_back({v, i});
        queries[v].push_back({u, i});
    }
    dfs(1);
    for (int i = 1; i <= q; i++)
        cout << ans[i] << '\n';
    return 0;
}