Cod sursa(job #1807443)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 16 noiembrie 2016 16:45:49
Problema Lowest Common Ancestor Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int N, Q;
vector<int> log, E, H, FirstPos, aux;
vector< vector<int> > M, G;

void Read();
void Preprocessing();
void Solve();
int Query(const int &a, const int &b);
void Euler(int node, int h);

int main()
{
    Read();
    Preprocessing();
    Solve();
    return 0;
}

void Solve() {
    int a, b;
    while(Q--) {
        scanf("%d%d", &a, &b);
        cout << Query(min(FirstPos[a], FirstPos[b]), max(FirstPos[a], FirstPos[b])) << '\n';
    }
}
int Query(const int &a, const int &b) {
    int k = log[b - a + 1];
    if(H[ M[a][k] ] < H[ M[b - (1 << k) + 1][k] ] )
        return M[a][k];
    else
        return M[b - (1 << k) + 1][k];
}
void Preprocessing() {
    H.assign(N+2, 0);
    FirstPos.assign(N+2, 0);
    Euler(1, 0);
    log.assign(2 * E.size() + 1, 0);

    for(int i = 2; i <= 2 * E.size() + 1; i++)
        log[i] = log[i / 2] + 1;

    int maxLog = log[E.size() - 1];
    aux.assign(maxLog + 2, 0);
    M.assign(2 * E.size() + 1, aux);

    for(int i = 0; i < E.size(); i++)
        M[i][0] = E[i];
    for(int k = 1; k <= maxLog ; k++)
        for(int i = 0; i < E.size(); i++)
            if(H[ M[i][k - 1] ] < H[ M[i + (1 << (k - 1) )][k - 1] ])
                M[i][k] = M[i][k - 1];
            else
                M[i][k] = M[i + (1 << (k - 1))][k - 1];
}

void Euler(int node, int h) {
    E.push_back(node);
    H[node] = h;
    FirstPos[node] = E.size() - 1;
    for(int i = 0; i < G[node].size(); i++) {
        Euler(G[node][i], h + 1);
        E.push_back(node);
    }
}

void Read() {
    freopen("lca.in", "rt", stdin);
    freopen("lca.out", "wt", stdout);
    scanf("%d%d", &N, &Q);
    G.assign(N + 2, vector<int>());
    int f;
    for(int i = 2; i <= N; i++) {
        scanf("%d", &f);
        G[f].push_back(i);
    }
}