Cod sursa(job #3363645)

Utilizator pkseVlad Bondoc pkse Data 20 august 2026 12:27:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
#define pb push_back
using namespace std;

const int nmax = 100'000, qmax = 2'000'000;

int ans[qmax];
int p[nmax];
bool viz[nmax];
vector<int> adj[nmax];
vector<pair<int, int>> qu[nmax];

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

void join(int u, int v) {
    p[find(v)] = find(u);
}

void dfs(int u = 0) {
    viz[u] = true;
    for(auto [v, i] : qu[u]) {
        if(viz[v]) ans[i] = find(v);
    }

    for(auto v : adj[u]) {
        dfs(v);
        join(u, v);
    }
}

int main() {
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    
    int n, q; cin >> n >> q;
    for(int i = 1; i < n; i ++) {
        int u; cin >> u; u --;
        adj[u].pb(i);
    }

    for(int i = 0; i < q; i ++) {
        int u, v; cin >> u >> v; u --; v --;
        qu[u].pb({v, i}), qu[v].pb({u, i});
    }

    iota(p, p + n, 0);
    dfs();

    for(int i = 0; i < q; i ++) {
        cout << 1 + ans[i] << '\n';
    }
}