Cod sursa(job #1070874)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 2 ianuarie 2014 11:30:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <math.h>
#define qu 100001
int a[17][qu];
int nivel[qu];
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");


int log2(int x)
{int q=1,n=0;
    while (q<=x)
    {
        q=q<<1;
        n++;
    }
    return n-1;
}

int nivelare(int x,int p)
{int l;
    
        while (p!=0)
        {l=log2(p);
            x=a[l][x];
            if (x==0) return x;
            p-=(1<<l);}
            return x;
        }

int cautare(int x,int y)
{int i=0;
    while (a[0][x]!=a[0][y])
    {i=0;
    while (a[i+1][x]!=a[i+1][y])
    {
        x=a[i][x];
        y=a[i][y];
        ++i;
    }
        x=a[0][x];
        y=a[0][y];
    }
   
    
    return a[0][x];
}

int main()
{int n,m,i,l,x,y,d,mij,j,p;
    f>>n>>m;
    nivel[1]=0;
    a[0][1]=0;
    for (i=2;i<=n;++i)
    {
        f>>a[0][i];
        nivel[i]=nivel[a[0][i]]+1;
    }

    for (i=1;(1<<i)<=n;i++)
        for (j=1;j<=n;j++) a[i][j]=a[i-1][a[i-1][j]];
    //for (i=2;i<=n;++i) g<<a[0][i]<<' ';
    for (i=0;i<m;++i)
    {
        f>>x>>y;
        p=nivel[x]-nivel[y];
        if (p<0) y=nivelare(y,abs(p));
        else if (p>0) x=nivelare(x,p);
        p=nivel[x];
 
        if (x==y) g<<x<<' '<<"\n";
        else
        g<<cautare(x,y)<<"\n";
    }
    

    return 0;
}