Cod sursa(job #2165157)

Utilizator edykpStoica Eduard-Constantin edykp Data 13 martie 2018 11:19:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include<cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int v[200001],use[100001],nivel[200001],m[200001][20],fr[100001];
struct nod
{
    int inf;
    nod *urm;
}*l[100001],*p;
int n,m2,k=0,nr=0;
void adaug(int x, nod*&p)
{
    nod *c;
    c=new nod;
    c->inf=x;
    c->urm=p;
    p=c;
}
void creare()
{
    int i,x;
    for(i=2;i<=n;i++)
    {

    f>>x;
        adaug(i,l[x]);
       // adaug(x,i);
    }
}
void df(int i,int nr)
{
nod *c;
v[++k]=i;
nivel[k]=nr;
if(!fr[i]) fr[i]=k;
use[i]=1;
for(c=l[i];c;c=c->urm)
if(!use[c->inf]) {df(c->inf,nr+1);v[++k]=i;nivel[k]=nr;}
}

int main()
{
    f>>n>>m2;
    int x,y;
    creare();
    df(1,0);
    for(int i=1;i<=k;i++)
        m[i][0]=i;
        for(int j=1;(1<<j)<=k;j++)
        for(int i=1;i+(1<<j)-1<=k;i++)
        if(nivel[m[i][j-1]]<nivel[m[i+(1<<(j-1))][j-1]])
        m[i][j]=m[i][j-1];
        else m[i][j]=m[i+(1<<(j-1))][j-1];
        while(f>>x>>y)
    {
        x=fr[x];
        y=fr[y];
        if(x>y) swap(x,y);
         int k =(int)log2(y-x+1);
         if(nivel[m[x][k]]<nivel[m[y-(1<<k)+1][k]])
            g<<v[m[x][k]]<<'\n';
         else g<<v[m[y-(1<<k)+1][k]]<<'\n';
    }
    return 0;
}