Cod sursa(job #3212371)

Utilizator maiaauUngureanu Maia maiaau Data 11 martie 2024 17:37:49
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
#define pb push_back

ifstream fin("lca.in");
ofstream fout("lca.out");

const int N = 1e5+3;

int n, m, k, t[N], ST[18][N], first[N], niv[N];
vector<vector<int>> e;

void read(), eulerTour(int);
int query(int,int);

int main()
{
    read();

    for (int i = 1, pw = 2; pw <= k; i++, pw *= 2)
        for (int j = 1; j + pw / 2 <= k; j++)
            ST[i][j] = (niv[ST[i-1][j]] < niv[ST[i-1][j+pw/2]] ? ST[i-1][j] : ST[i-1][j+pw/2]);
    
    while (m--){
        int a, b; fin >> a >> b;
        a = first[a]; b = first[b];
        if (a > b) swap(a, b);
        fout << query(a, b) << '\n';
    }

    return 0;
}

void read(){
    fin >> n >> m;
    e.resize(n+3);
    for (int i = 2; i <= n; i++) {
        fin >> t[i]; 
        if (t[i]) e[t[i]].pb(i);
    }
    eulerTour(1);
}
void eulerTour(int nod){
    first[nod] = ++k;
    niv[nod] = niv[t[nod]] + 1;
    ST[0][k] = nod;
    for (auto it: e[nod]){
        eulerTour(it);
        ST[0][++k] = nod;
    }
}
int query(int l, int r){
    int pw = 31 - __builtin_clz(r - l + 1);
    return (niv[ST[pw][l]] < niv[ST[pw][r - (1<<pw) + 1]] ? ST[pw][l] : ST[pw][r - (1<<pw) + 1]);
}