Cod sursa(job #2937063)

Utilizator DooMeDCristian Alexutan DooMeD Data 9 noiembrie 2022 20:04:37
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
const int logmax = 16;

vector<vector<int>> dx(nmax+5);
int up[nmax+5][logmax+5], niv[nmax+5];

void dfs(int node, int father) {
    for(int i=1; i<=logmax; i++)
        up[node][i] = up[up[node][i-1]][i-1];
    for(auto i : dx[node]) {
        if(i == father) continue;

        up[i][0] = node;
        niv[i] = niv[node] + 1;
        dfs(i, node);
    }
}

int lca(int a, int b) {
    if(niv[a] < niv[b]) swap(a, b);
    for(int i=logmax; i>=0; i--)
        if(up[a][i] and niv[up[a][i]] >= niv[b])
            a = up[a][i];
    if(a == b) return a;
    for(int i=logmax; i>=0; i--)
        if(up[a][i] != up[b][i]) {
            a = up[a][i];
            b = up[b][i];
        }
    return up[a][0];
}

int main() {
    ifstream f("lca.in");
    ofstream g("lca.out");

    int n, q; f >> n >> q;
    for(int x=2; x<=n; x++) {
        int y; f >> y;
        dx[x].emplace_back(y);
        dx[y].emplace_back(x);
    }
    dfs(1, 0);
    for(int i=1; i<=q; i++) {
        int a, b; f >> a >> b;
        g << lca(a, b) << "\n";
    }
    return 0;
}