Cod sursa(job #2565433)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 2 martie 2020 14:14:00
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, nrE, i, sol, j, x, y, a, b, k;
int eu[500005], f[100005], first[100005], l[500005];
int rmq[500005][20];

vector <int> L[100005];

void euler (int nod){
    int vecin;
    f[nod] = 1;
    for (int i=0; i<L[nod].size(); i++){
        vecin = L[nod][i];
        if (f[vecin] == 0){
            euler (vecin);
        }
        eu[++nrE] = nod;
    }
}

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