Cod sursa(job #795574)

Utilizator costyv87Vlad Costin costyv87 Data 8 octombrie 2012 23:18:23
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <vector>
#define nm 100100
#define pb push_back
using namespace std;
FILE *f,*g;
int rmq[nm][19],niv[nm*2],eul[nm*2],lg[2*nm],st[nm];
vector <int> a[nm];
int nn=-1,n,m,i,x,y,nr;


void dfs(int x,int nv)
{
    int i;
    eul[++nn]=x;
    st[x]=nn;
    niv[nn]=nv;

    for (i=0;i<a[x].size();i++ )
    {
        dfs(a[x][i],nv+1);
        eul[++nn]=x;
        niv[nn]=nv;
    }
}

void pre_rmq()
{
    int i,j;

    for (i=2;i<=nn;i++)
        lg[i]=lg[i>>1]+1;
    for (i=0;i<=nn;i++)
        rmq[i][0]=i;

    for (j=1,i=0;(1<<j)<nn;j++)
        for (i=0;i<=nn-(1<<j);i++)
            if (niv[rmq[i][j-1]]<niv[rmq[i+(1<<(j-1))][j-1]])
                rmq[i][j]=rmq[i][j-1];
            else
                rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}

int main()
{
    f=fopen("lca.in","r");
    g=fopen("lca.out","w");

    fscanf(f,"%d%d",&n,&m);

    for (i=2;i<=n;i++)
    {
        fscanf(f,"%d",&x);
        a[x].pb(i);
    }

    dfs(1,0);
    pre_rmq();

    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&x,&y);
        x=st[x];
        y=st[y];

        nr=lg[y-x+1];

        if (niv[rmq[x][nr]]<niv[rmq[y-(1<<nr)+1][nr]])
                fprintf(g,"%d\n", eul[rmq[x][nr]]);
        else
                fprintf(g,"%d\n",eul[rmq[y-(1<<nr)+1][nr]]);

    }

    fclose(g);
    return 0;
}