Cod sursa(job #2719927)

Utilizator KPP17Popescu Paul KPP17 Data 10 martie 2021 13:48:58
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 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];
#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);
        for (int p = 0, s = V[b] - V[a]; s; p++, s >>= 1)
            if (s & 1) b = S[p][b];
        if (a == b) {out << a << '\n'; continue;}
        for (int p = log(n); p--;)
            if (S[p][a] != S[p][b])
                a = S[p][a], b = S[p][b];
        out << (*S)[a] << '\n';
    }
}