Cod sursa(job #2427270)

Utilizator retrogradLucian Bicsi retrograd Data 31 mai 2019 13:46:25
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

int n, timer;
vector<vector<int>> graph, qrs;
vector<int> finish, link, answer;
vector<pair<int, int>> queries;

int Find(int x) {
    if (link[x] == -1) return x;
    return link[x] = Find(link[x]);
}
void Union(int son, int node) { 
    link[son] = 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 i : qrs[node]) {
        int oth = node ^ queries[i].first ^ queries[i].second;
        if (finish[oth] != -1)
            answer[i] = Find(oth);
    } 
}

int main() {
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    
    int q; cin >> n >> q;
    queries.resize(q); answer.resize(q);
    graph.resize(n); qrs = graph;
    finish.assign(n, -1); link = finish;
    timer = 0;

    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;
        queries[i] = {a, b};
        qrs[a].push_back(i);
        qrs[b].push_back(i);
    }
    DFS(0, -1);

    for (auto x : answer) 
        cout << x + 1 << '\n';
    return 0;
}