Cod sursa(job #2972319)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 29 ianuarie 2023 03:08:26
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
#define PII pair < int , int >
#define NMAX 100100
#define LOG 18

using namespace std;

int n, m, k, R[NMAX][LOG], last[NMAX], l[2 * NMAX], E[2 * NMAX];
vector <int> V[NMAX];

void euler(int x) {
    E[++k] = x;
    last[x] = k;
    
    for (auto it : V[x]) {
        euler(it);
        
        E[++k] = x;
        last[x] = k;
    }
}

int lca(int x, int y) {
    x = last[x];
    y = last[y];

    if (x > y) {
        swap(x, y);
    }

    int l2 = l[y - x + 1];
    
    return min(R[x][l2], R[y - (1 << l2) + 1][l2]);
}

int main(){
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    
    cin >> n >> m;
    for (int i = 2, x; i <= n; i++) {
        cin >> x;

        V[x].push_back(i);
    }

    euler(1);
    for (int i = 2; i <= k; i++) {
        l[i] = l[i >> 1] + 1;
    }


    for (int i = 1; i <= k; i++) {
        R[i][0] = E[i];
    }

    for (int j = 1; j < LOG; j++) {
        for (int i = 1; i + (1 << j) <= k; i++) {
            R[i][j] = min(R[i][j - 1], R[i + (1 << (j - 1))][j - 1]);
        }
    }

    while (m--) {
        int x, y;

        cin >> x >> y;
        cout << lca(x, y) << "\n";
    }

    return 0;
}