Cod sursa(job #1713096)

Utilizator andreiudilaUdila Andrei andreiudila Data 4 iunie 2016 17:48:33
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#define logn 19
#include <fstream>
#include <math.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

int n,m,i,t,x,y;
int str[100001][20], lev[100001];
typedef struct celula{

int nod;
celula *next;

}*lista;

lista graf[100001],p,a;


void dfs(int nod, int nivel)
{
    lev[nod]=nivel;
    for(int i=1;i<=logn;++i)
        str[nod][i]=str[str[nod][i-1]][i-1];

    for(lista p=graf[nod]; p; p=p->next)
        if(lev[p->nod]==0) dfs(p->nod,nivel+1);
}

int lev_up(int nod, int nivel){

    for(int i=logn; i>=0; --i)
    if(lev[str[nod][i]]<nivel) continue;
    else nod=str[nod][i];

    return nod;

}


int LCA(int nod1, int nod2){

if(lev[nod1]<lev[nod2]) swap(nod1, nod2);

    nod1=lev_up(nod1, lev[nod2]);

    if(nod1==nod2) return nod1;

    for(int i=19;i>=0; --i)
        if(str[nod1][i]==str[nod2][i]) continue;
    else{

        nod1=str[nod1][i];
        nod2=str[nod2][i];
    }

    return str[nod1][0];

}

int main()
{
    fin>>n>>m;
    for(i=2;i<=n;++i)
    {

        fin>>t;
        str[i][0]=t;

        a=new celula;
        a->nod=t;
        a->next=graf[i];
        graf[i]=a;

        a=new celula;
        a->nod=i;
        a->next=graf[t];
        graf[t]=a;
    }


    dfs(1,1);

    for(i=1;i<=m;++i)
    {
        fin>>x>>y;
        fout<<LCA(x,y)<<"\n";
    }



    return 0;
}