Cod sursa(job #2719786)

Utilizator KPP17Popescu Paul KPP17 Data 10 martie 2021 12:10:49
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 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 = 100001; int S[log(N)][N], V[N];
int Q(int s, int i) {for (int p = 0; s; p++, s >>= 1) if (s & 1) i = S[p][i]; return i;}
#include <vector>
std::vector<int> L[N];
void DFS(int t) {for (int f: L[t]) V[f] = V[t] + 1, DFS(f);}
int main()
{
    int n, m; in >> n >> m; for (int i = 2; i <= n; i++) in >> (*S)[i], L[(*S)[i]].push_back(i);
    for (int p = 1, ln = log(n); p < ln; p++) for (int i = 1; i <= n; i++) S[p][i] = S[p-1][ S[p-1][i] ];
    DFS(1); while (m--)
    {
        int a, b; in >> a >> b;
        if (V[b] < V[a]) std::swap(a, b);
        b = Q(V[b] - V[a], b);
        int i = 0, j = V[a], m; while (i <= j)
            if (m = i+j>>1, Q(m, a) == Q(m, b)) j = m - 1; else i = m + 1;
        out << Q(i, a) << '\n';
    }
}