Cod sursa(job #2720729)

Utilizator KPP17Popescu Paul KPP17 Data 11 martie 2021 11:10:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
#define mF "lca"
std::ifstream in(mF ".in");
std::ofstream out(mF ".out");
constexpr int log(int e) {return e? log(e >> 1) + 1: 1;}
const int N = 300000, L = N-1<<1; int E[log(L)][L], I[N], V[N], l, G[N];
#include <vector>
std::vector<int> F[N];
void DFS(int t) {l++; I[(*E)[l] = t] = l; for (int f: F[t]) V[f] = V[t] + 1, DFS(f), (*E)[++l] = t;}
int main()
{
    int n, m; in >> n >> m; for (int f = 2; f <= n; f++) {int t; in >> t; F[t].push_back(f);}
    DFS(1); for (int i = 2; i <= l; i++) G[i] = G[i>>1] + 1;
    for (int p = 1; p <= G[l]; p++) for (int i = 1, j; j = i + (1<<p-1), j <= l; i++)
    {const int &a = E[p-1][i], &b = E[p-1][j]; E[p][i] = V[a] < V[b]? a: b;}
    while (m--)
    {
        int x, y; in >> x >> y; x = I[x]; y = I[y]; if (y < x) std::swap(x, y);
        const int &p = G[y-x], &a = E[p][x], &b = E[p][y-(1<<p)+1]; out << (V[a] < V[b]? a: b) << '\n';
    }
}