Cod sursa(job #2566974)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 3 martie 2020 14:15:09
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

#define MAXN    100005
#define LOG2    20

int N, M;
std::vector <int> ADC[MAXN];
inline void addEdge(int u, int v) {
    ADC[u].push_back(v);
    ADC[v].push_back(u);
}

int depth[MAXN];
int sparse[LOG2][MAXN];
void DFS(int vertex = 1, int parent = 0) {
    depth[vertex] = depth[parent]+1;
    sparse[0][vertex] = parent;
    for (int i=1; i<LOG2; ++i)
        sparse[i][vertex] = sparse[i-1][sparse[i-1][vertex]];
    for (auto &it:ADC[vertex]) {
        if (it == parent) continue;
        DFS(it, vertex);
    }
}
int LCA(int u, int v) {
    if (depth[u] < depth[v]) std::swap(u, v);
    for (int i=LOG2-1; i>=0; --i)
        if (depth[sparse[i][u]] >= depth[v])
            u = sparse[i][u];
    if (u == v) return u;
    for (int i=LOG2-1; i>=0; --i)
        if (sparse[i][u] != sparse[i][v])
            u = sparse[i][u], v = sparse[i][v];
    return sparse[0][u];
}

#define FILENAME    std::string("lca")
std::ifstream input (FILENAME+".in");
std::ofstream output(FILENAME+".out");

int32_t main()
{
    input >> N >> M;
    for (int i=1, u; i<N; ++i)
        input >> u, addEdge(u, i+1);
    DFS();
    for (int i=1, x, y; i<=M; ++i)
        input >> x >> y, output << LCA(x, y) << '\n';

    return 0;
}