Cod sursa(job #2427275)

Utilizator retrogradLucian Bicsi retrograd Data 31 mai 2019 13:50:26
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 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;
}