Cod sursa(job #3140210)

Utilizator sebuxSebastian sebux Data 4 iulie 2023 18:57:46
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

const int sze = 100000;
int rmq[sze][34];
int L[4 * sze];
int E[4 * sze + 1];
int H[sze + 1];
int N;
vector<int> G[sze + 1];

void RMQ(int RMQ_SIZE) {
    for (int i = 0; i < RMQ_SIZE; ++i) rmq[i][0] = i;
    int a, b;
    for (int j = 1; (1 << j) <= RMQ_SIZE; ++j) {
        for (int i = 0; i < RMQ_SIZE - (1 << j) + 1; ++i) {
            a = rmq[i][j - 1];
            b = rmq[i + (1 << (j - 1))][j - 1];
            if (L[a] <= L[b]) rmq[i][j] = a;
            else rmq[i][j] = b;
        }
    }
}

int queryRmq(int a, int b) {
    --a;
    --b;
    if (b < a) swap(a, b);
    int k = log2(b - a + 1);
    if (L[rmq[a][k]] <= L[rmq[b - (1 << k) + 1][k]]) return rmq[a][k] + 1;
    return rmq[b - (1 << k) + 1][k] + 1;
}


int e_cnt = 0;
void SRD(int x, int nivel) {
    L[e_cnt] = nivel;
    E[++e_cnt] = x;
    if(H[x] == 0) H[x] = e_cnt;
    for (int i : G[x]) {
        SRD(i, nivel + 1);
        L[e_cnt] = nivel;
        E[++e_cnt] = x;
    }
}


int main() {
    int m;
    fin >> N >> m;
    int x;
    for (int i = 2; i <= N; ++i) {
        fin >> x;
        G[x].pb(i);
    }
    SRD(1, 0);

    RMQ(2 * N - 1);



    int a, b;
    while (m--) {
        fin >> a >> b;
        fout << E[queryRmq(H[a], H[b])]<<"\n";
    }
    









    return 0;
}