Cod sursa(job #969675)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 4 iulie 2013 23:54:23
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>

using namespace std;

ifstream fin("lca.in");
ofstream fout ("lca.out");

struct node
{
    int nr;
    node *next;
}*v[100001];

int E[200001],L[200001],F[200001],RMQ[200001][18],log[200001];
int n,m,t,x,i,j,k,temp;

void create_edge (int a, int b)
{
    node *d=new node;
    d->nr=b;
    d->next=v[a];
    v[a]=d;
}

void dfs (int x, int lv)
{
    ++t;
    E[t]=x;
    L[t]=lv;
    F[x]=t;
    for (node *d=v[x]; d!=NULL; d=d->next)
    {
        dfs (d->nr,lv+1);
        ++t;
        E[t]=x;
        L[t]=lv;
    }
}

int main()
{
    fin>>n>>m;
    for (i=1;i<n;i++)
    {
        fin>>x;
        create_edge (x,i+1);
    }
    dfs (1,1);

    log[1]=0;
    for (i=2; i<=t; i++) log[i]=log[i/2]+1;

    for (i=1; i<=t; i++) RMQ[i][0]=i;
    for (j=1; 1<<j<=t; j++)
    {
        int p=1<<(j-1);
        for (i=1; i<=t-(1<<j)+1; i++)
           if (L[RMQ[i][j-1]] < L[RMQ[i+p][j-1]]) RMQ[i][j] = RMQ[i][j-1];
           else RMQ[i][j] = RMQ[i+p][j-1];
    }

    for (k=1; k<=m; k++)
    {
        int a,b;
        fin>>a>>b;

        a=F[a];
        b=F[b];

        if (b<a)
        {
            temp=a;
            a=b;
            b=temp;
        }


        int c=log[b-a+1];

        if (L[RMQ[a][c]] < L[RMQ[b-(1<<c)+1][c]]) fout<<E[RMQ[a][c]];
        else fout<<E[RMQ[b-(1<<c)+1][c]];
        fout<<"\n";
    }
}