Cod sursa(job #927964)

Utilizator lily3Moldovan Liliana lily3 Data 26 martie 2013 10:11:03
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

int i,j,n,k,lm,m,d[300010][51],nr=0,prim[100010],rang[300010],x,y,niv[100010];
vector<int> a[100010];
void euler(int nod)
{
    d[++nr][0]=nod;
    prim[nod]=nr;
    for(int i=0;i<a[nod].size();++i)
    {
        niv[a[nod][i]]=niv[nod]+1;
        euler(a[nod][i]);
        d[++nr][0]=nod;
    }
}
int main()
{
    FILE *f=fopen("lca.in","r");
    FILE *g=fopen("lca.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=2;i<=n;++i)
    {
        fscanf(f,"%d",&j);
        a[j].push_back(i);
    }
    euler(1);
    rang[0]=0;
    for(i=2;i<=nr;++i)
        rang[i]=rang[i/2]+1;
    for(i=1;(1<<i)<=nr;++i)
    {
        lm=nr-(1<<i)+1;
        k=1<<(i-1);
        for(j=1;j<=lm;++j)
        {
            if(niv[d[j][i-1]]<d[j+k][i-1])
            d[j][i]=d[j][i-1];
            else
            d[j][i]=d[j+k][i-1];
        }
    }
    for(i=1;i<=m;++i)
    {
        fscanf(f,"%d%d",&x,&y);
        if(prim[x]<prim[y])
            x=prim[x],y=prim[y];
        else
        {
            int aux=x;
            x=prim[y],y=prim[aux];
        }
        k=rang[y-x+1];
        lm=(y-x+1)-(1<<k);
        int min1;
        if(niv[d[x][k]]<niv[d[x+lm][k]])
        min1=d[x][k];
        else
        min1=d[x+lm][k];
        fprintf(g,"%d\n",min1);
    }
    return 0;
}