Cod sursa(job #2279600)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 9 noiembrie 2018 20:01:18
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#define DIM 100010
using namespace std;

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

int n,m,i,j,x,y,px,py,val,k;
vector <int> L[DIM];
int niv[DIM],v[2*DIM],poz[DIM],p[2*DIM];
pair <int,int> d[20][2*DIM];

void dfs (int nod){

    v[++k] = nod;
    poz[nod] = k; /// prima aparitie in parcurgerea euler
    for (int i=0;i<L[nod].size();i++){
        int vecin = L[nod][i];
        niv[vecin] = 1 + niv[nod];
        dfs (vecin);
        v[++k] = nod;

    }
}

int main (){

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

    /*for (i=1;i<=k;i++)
        fout<<v[i]<<" ";
    fout<<"\n";*/

    for (i=2;i<=k;i++)
        p[i] = p[i/2] + 1;
    for (i=1;i<=k;i++)
        d[0][i] = make_pair (niv[v[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;
        /// gasim primele pozitii in parcurgere EULER
        /// solutia va fi minimul din secventa respectiva;
        px = poz[x];
        py = poz[y];
        if (px > py)
            swap (px,py);
        /// minimul din seventa px.. py
        val = p[py-px+1];
        pair <int,int> sol = min (d[val][px],d[val][py-(1<<val)+1]);
        fout<<v[sol.second]<<"\n";
    }



    return 0;
}