Cod sursa(job #1744867)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 20 august 2016 17:02:56
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
#include<stdlib.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,j,nr,ap[100001],val,v[100001],a,b,log[200002],minim[20][200002],mins,maxs,l;
struct nod{
   int inf;
   nod *urm;
}*L[100001];
struct euler{
   int nod,nivel;
}coada[200002];
void adaugsf(nod *&vf,int val){
    nod *q;
    q=new nod;
    q->inf=val;
    q->urm=vf;
    vf=q;
}
void cit(){
    fin>>n>>m;
    for (i=1;i<=n;i++)
        L[i]=0;
    for (i=2;i<=n;i++){
        fin>>val;
        adaugsf(L[val],i);
    }
}
void DFS(int k,int niv){
    nod *q;
    nr++;v[k]=1;
    coada[nr].nivel=niv;
    coada[nr].nod=k;
    if (ap[k]==0) ap[k]=nr;
    q=L[k];
    while(q!=0){
        if (v[q->inf]==0) DFS(q->inf,niv+1);
        nr++;
        coada[nr].nivel=niv;
        coada[nr].nod=k;
        q=q->urm;
    }
}
int main(){
    cit();
    DFS(1,0);
    log[1]=0;
    for (i=2;i<=nr;i++){
        log[i]=log[i/2]+1;
        minim[0][i]=i;
    }
    for (j=1;(1<<j)<=nr;j++){
        i=1;l=1<<(j-1);
        while(i+2*l<=nr){
            if (coada[minim[j-1][i]].nivel<coada[minim[j-1][i+l]].nivel) minim[j][i]=minim[j-1][i];
                 else
                    minim[j][i]=minim[j-1][i+l];
            i++;
        }
    }
    for (i=1;i<=m;i++){
        fin>>a>>b;
        if (ap[a]<ap[b]){
            mins=ap[a];
            maxs=ap[b];
        }
           else
           {
               maxs=ap[a];
               mins=ap[b];
           }
        val=log[maxs-mins+1];l=1<<val;
        if (coada[minim[val][mins]].nivel<coada[minim[val][maxs-l+1]].nivel) fout<<coada[minim[val][mins]].nod<<'\n';
           else
            fout<<coada[minim[val][maxs-l+1]].nod<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}