Cod sursa(job #2749084)

Utilizator RaduNichitaRadu Nichita RaduNichita Data 4 mai 2021 21:51:15
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>

#define NMAX 100005

class Task {
    std::vector<int> parent;
    std::vector<std::pair<int, int>> queries;
    int n, m;
    std::vector<int> adj[NMAX];

    void read_input() {
        std::ifstream fin("lca.in");
        fin >> n >> m;
        parent = std::vector<int>(n + 1);
        for (int i = 2; i <= n; ++i) {
            int node;
            fin >> node;
            parent[i] = node;
            adj[node].push_back(i);
        }

        for (int i = 1; i <= m; ++i) {
            int src, dst;
            fin >> src >> dst;
            queries.push_back({src, dst});
        }

        fin.close();
    }

    std::vector<int> lca() {

        int source = 1;
        std::vector<int> res;

        std::vector<int> level(n + 1, 1 << 30);
        std::queue<int> q;
        std::vector<bool> visited(n + 1, false);
        level[source] = 0;
        visited[source] = true;
        q.push(source);
        while (!q.empty()) {
            auto node = q.front();;
            q.pop();
            for (auto neigh : adj[node]) {
                if (!visited[neigh]) {
                    level[neigh] = level[node] + 1;
                    visited[neigh] = 1;
                    q.push(neigh);
                }
            }
        }


        for (auto query : queries) {
            auto src = query.first;
            auto dst = query.second;
            while (src != dst) {
                if (level[src] < level[dst]) {
                    dst = parent[dst];
                } else {
                    src = parent[src];
                }
            }
            res.push_back(src);
        }

        return res;
    }

    void print_output(std::vector<int> res) {
        std::ofstream out("lca.out");
        for (auto ancestor : res) {
            out << ancestor << "\n";
        }
        out.close();
    }

 public:
    void solve() {
        read_input();
        print_output(lca());
    }
};


int main() {
    Task *t = new Task();
    t->solve();
    return 0;
}