Cod sursa(job #1980797)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 13 mai 2017 23:30:09
Problema Lowest Common Ancestor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>
#include <stdlib.h>
int nod[100001],next[100001],lista[100001],e[200001],niv[200001],log[200001],nr;
int rmq[200001][21],aux[200001][21],ap[100001];
void euler(int x,int k)
{
    int z;
    e[++nr]=x;
    niv[nr]=k;
    z=lista[x];
    while(z)
    {
        euler(nod[z],k+1);
        e[++nr]=x;
        niv[nr]=k;
        z=next[z];
    }
}
void add(int x,int y)
{
    nr++;
    next[nr]=lista[x];
    nod[nr]=y;
    lista[x]=nr;
}
int main()
{
    int n,m,i,x,j,a,b,r,l;
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=2; i<=n; i++)
    {
        scanf("%d",&x);
        add(x,i);
    }
    for(i=2; i<=2*n; i++)
        log[i]=log[i/2]+1;
    nr=0;
    euler(1,1);
    for(i=1; i<=2*n; i++)
        rmq[i][0]=niv[i],aux[i][0]=e[i];
    for(i=1; i<=2*n; i++)
        for(j=1; j<=log[i]; j++)
            if(rmq[i][j-1]<rmq[i-(1<<(j-1))][j-1])
                rmq[i][j]=rmq[i][j-1],aux[i][j]=aux[i][j-1];
            else
                rmq[i][j]=rmq[i-(1<<(j-1))][j-1],aux[i][j]=aux[i-(1<<(j-1))][j-1];
    for(i=1; i<=2*n; i++)
        if(ap[e[i]]==0)
            ap[e[i]]=i;
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&a,&b);
        if(ap[a]>ap[b])
        {
            r=a;
            a=b;
            b=r;
        }
        l=log[ap[b]-ap[a]+1];
        if(rmq[ap[a]+(1<<l)-1][l]<rmq[ap[b]][l])
            printf("%d\n",aux[ap[a]+(1<<l)-1][l]);
        else
            printf("%d\n",aux[ap[b]][l]);
    }

    return 0;
}