Cod sursa(job #1812096)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 21 noiembrie 2016 20:37:57
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ofstream out("lca.out");
ifstream in("lca.in");
const int N_MAX = 100000;
const int L_MAX = 18;
vector<int> vecini[N_MAX + 1];
int rmq[L_MAX][2*N_MAX + 2];
int First[N_MAX+1];
bool isin[N_MAX+1];
int log2[N_MAX+1];
int k;
void dfs(int nod)
{
    rmq[0][++k] = nod;
    if(!isin[nod])  First[nod] = k;
    isin[nod] = true;
    for(int t : vecini[nod])
    {
        dfs(t);
        rmq[0][++k] = nod;
    }
}

int main()
{
    int n, m, k=0;
    in >> n >> m;
    for(int i=2; i<=n; i++)
    {
        int x;
        in >> x;
        vecini[x].push_back(i);
    }
    dfs(1);

    log2[1] = 0;
    for(int i=2; i<=2*n; i++)
        log2[i] = log2[i/2]+1;
    for(int i=1; (1<<i) <= 2*n; i++)
        for(int j=1; j<=2*n-(1<<i); j++)
        {
            int l = 1<<(i-1);
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+l]);
        }

    for(int i=1; i<=m; i++)
    {
        int p, q;
        in >> p >> q;
        int t = min(First[p],First[q]);
        int diff = First[p] + First[q] - 2*t + 1;
        int l = log2[diff];
        int sh = diff - (1<<l);
        out << min(rmq[l][t], rmq[l][t+sh]) << "\n";
    }
    return 0;
}