Cod sursa(job #1415123)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 3 aprilie 2015 19:50:09
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#include <vector>
#define NMax 100010
#define minim(a,b)((a>b)?b:a)
using namespace std;
int n,m,x,y,poz[4*NMax],level=-1,D[50][4*NMax],lg[4*NMax],k;
std::vector<int> G[NMax],nivel,nod;
void Parc_Euler(int x0)
{
    level+=1;
    nivel.push_back(level);
    nod.push_back(x0);
    if(poz[x0]==0)poz[x0] = nivel.size()-1;
    for(int i=0;i<G[x0].size();++i)
    {
        x = G[x0][i];
        Parc_Euler(x);
        nivel.push_back(level);
        nod.push_back(x0);
    }
    level-=1;
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d %d",&n,&m);
    nivel.push_back(0);
    nod.push_back(0);
    for(int i=2;i<=n;++i)
    {
        scanf("%d",&x);
        G[x].push_back(i);
    }
    Parc_Euler(1);
    n = nivel.size()-1;
    //printf("%d",n);
    for(int i=2;i<=n;++i)lg[i] = lg[i/2]+1;
    for(int i=1;i<=n;++i)D[0][i] = i;
    for(int i=1;i<=lg[n];++i)
    {
        for(int j=1;j<=n-(1<<(i-1));++j)
        {
            if(nivel[D[i-1][j]]<nivel[D[i-1][j+(1<<(i-1))]])D[i][j] = D[i-1][j];
            else D[i][j] = D[i-1][j+(1<<(i-1))];
        }
    }
    /*for(int i=1;i<=m;++i)
    {
        scanf("%d %d",&x,&y);
        x = poz[x];
        y = poz[y];
        k = lg[y-x+1];
        if(nivel[D[k][x]]<nivel[D[k][y-(1<<k)+1]])printf("%d\n",nod[D[k][x]]);
        else printf("%d\n",nod[D[k][y-(1<<k)+1]]);
        //printf("%d\n",nod[minim(nivel[D[k][x]],nivel[D[k][y-(1<<k)+1]])]);
    }*/
    return 0;
}