Cod sursa(job #2499637)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 26 noiembrie 2019 16:04:05
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define DIM 100005

using namespace std;

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

int n, m, k, i, j, a, b, x, y;
int e[2*DIM], nivel[2*DIM], l[2*DIM], first[DIM];
int d[20][2*DIM];

vector <int> L[DIM];

void euler (int nod, int niv){
    int vecin;
    e[++k] = nod;
    nivel[k] = niv;
    first[nod] = k;
    for (int i=0; i<L[nod].size(); i++){
        vecin = L[nod][i];
        euler (vecin, niv + 1);
        e[++k] = nod;
        nivel[k] = niv;
    }
}

int main(){
    fin >> n >> m;
    for (i=1; i<=n-1; i++){
        fin >> a;
        L[a].push_back(i+1);
    }
    euler(1, 1);
    l[1] = 0;
    for (i=2; i<=k; i++){
        l[i] = l[i/2] + 1;
    }
    for (i=1; i<=k; i++){
        d[0][i] = i;
    }
    for (i=1; i<=l[k]+1; i++){
        for (j=1; j<=k; j++){
            d[i][j] = d[i-1][j];
            if (j+(1<<(i-1)) <= k && nivel[d[i][j]] > nivel[d[i-1][j+(1<<(i-1))]]){
                d[i][j] = d[i-1][j+(1<<(i-1))];
            }
        }
    }
    for (i=1; i<=m; i++){
        fin >> x >> y;
        x = first[x], y = first[y];
        a = min (x, y), b = max (x, y);
        k = l[b-a+1];
        if (nivel[d[k][a]] < nivel[d[k][b-(1<<k)+1]]){
            fout << e[d[k][a]] << "\n";
        }
        else{
            fout << e[d[k][b-(1<<k)+1]] << "\n";
        }
    }
    return 0;
}