Cod sursa(job #2412378)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 22 aprilie 2019 10:35:46
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#define DIM 200010
using namespace std;

ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n,m,i,j,nr,x,y,k,pozx,pozy;
vector <int> L[DIM];
int first[DIM],N[DIM],E[DIM],viz[DIM],p[DIM];
pair <int,int> d[32][DIM];
void dfs (int nod, int niv){
    viz[nod] = 1;
    N[nod] = niv;
    E[++k] = nod;
    first[nod] = k;
    for (int i=0;i<L[nod].size();i++){
        int vecin = L[nod][i];
        if (!viz[vecin]){
            dfs (vecin,niv+1);
            E[++k] = nod;
        }
    }
}
int main (){

    fin>>n>>m;
    for (i=1;i<n;i++){
        fin>>x;
        L[x].push_back(i+1);
    }
    dfs (1,1);

    for (i=2;i<=k;i++)
        p[i] = p[i/2]+1;
    for (i=1;i<=k;i++)
        d[0][i] = make_pair(N[E[i]],i);

    for (i=1;(1<<i)<=k;i++)
        for (j=1;j<=k;j++){
            d[i][j] = d[i-1][j];
            if (j+(1<<(i-1)) <= k && d[i-1][j+(1<<(i-1))] .first< d[i][j].first)
                d[i][j] = d[i-1][j+(1<<(i-1))];
            //d[i][j] = min (d[i-1][j],d[i-1][j+(1<<(i-1))]);
        }
    for (;m--;){
        fin>>x>>y;
        pozx = first[x], pozy = first[y];
        if (pozx > pozy)
            swap (pozx,pozy);
        nr = p[pozy-pozx+1];
        pair <int,int> sol = min(d[nr][pozx],d[nr][pozy-(1<<nr)+1]);
        fout<<E[sol.second]<<"\n";
    }

    return 0;
}