Cod sursa(job #2940780)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 16 noiembrie 2022 13:50:36
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;
const unsigned seed = chrono :: system_clock :: now().time_since_epoch().count();
mt19937 rng(seed);
using ll = long long;
const int N = 1e5 + 5, S = 330;
int tin[N], tout[N], timer, euler[2 * N][18], d[N], r[2 * N];
int upd_queue[S + 5];
vector <int> g[N];
void dfs(int u, int p = 0) {
    d[u] = d[p] + 1;
    tin[u] = ++timer;
    r[timer] = u;
    euler[timer][0] = tin[u];
    for(int v : g[u]) if(v != p)
        dfs(v, u);
    tout[u] = ++timer;
    euler[timer][0] = tin[p];
}
int lg2[2 * N];
void precalc_lca(int n) {
    for(int i = 2; i <= 2 * n; i++)
        lg2[i] = lg2[i >> 1] + 1;
    for(int l = 1; l <= 17; l++)
        for(int i = 1; i <= 2 * n; i++)
            euler[i][l] = min(euler[i][l - 1], euler[i + (1 << l - 1)][l - 1]);
}
int lca(int u, int v) {
    if(tin[u] <= tin[v] && tout[v] <= tout[u]) return u;
    if(tin[v] <= tin[u] && tout[u] <= tout[v]) return v;
    if(tin[u] > tin[v]) swap(u, v);
    u = tout[u]; v = tin[v];
    int l = lg2[v - u + 1];
    int tinlca = min(euler[u][l], euler[v - (1 << l) + 1][l]);
    return r[tinlca];
}

int main()
{
    const string fname = "lca";
    ifstream  cin(fname + ".in");
    ofstream  cout(fname + ".out");
//    ios_base :: sync_with_stdio(false); cin.tie(0);
    int n, m;
    cin >> n >> m;
//    for(int i = 1, u, v; i < n; i++)
//        cin >> u >> v,
//        g[u].push_back(v),
//        g[v].push_back(u);
    for(int u = 2, v; u <= n; u++)
        cin >> v,
        g[u].push_back(v),
        g[v].push_back(u);
    dfs(1);
    precalc_lca(n);
    for(int i = 1, u, v; i <= m; i++)
        cin >> u >> v,
        cout << lca(u, v) << "\n";
    return 0;
}