Cod sursa(job #2427552)

Utilizator PrekzursilAndrei Visalon Prekzursil Data 31 mai 2019 23:25:24
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;
int n, timer;
vector<vector<int>> graph;
vector<vector<pair<int, int>>> qrs;
vector<int> finish, link, answer;
int Find(int x) {
    if (link[x] == -1) return x;
    return link[x] = Find(link[x]);
}
void Union(int son, int node) {
    link[Find(son)] = Find(node);
}
void DFS(int node, int par) {
    for (auto vec : graph[node]) {
        if (vec == par) continue;
        DFS(vec, node);
        Union(vec, node);
    }
    finish[node] = timer++;
    for (auto itr : qrs[node]) {
        if (finish[itr.first] != -1)
            answer[itr.second] = Find(itr.first);
    }
}
int main() {
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    int q; cin >> n >> q;
    graph.resize(n);
    qrs.resize(n);
    finish.assign(n, -1);
    link = finish;
    timer = 0;
    answer.resize(q);
    for (int i = 1; i < n; ++i) {
        int par; cin >> par;
        graph[par - 1].push_back(i);
    }
    for (int i = 0; i < q; ++i) {
        int a, b; cin >> a >> b; --a; --b;
        qrs[a].emplace_back(b, i);
        qrs[b].emplace_back(a, i);
    }
    DFS(0, -1);
    for (auto x : answer)
        cout << x + 1 << '\n';
    return 0;
}