Cod sursa(job #767520)

Utilizator test_666013Testez test_666013 Data 13 iulie 2012 18:45:54
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 100001

vector<int> g[MAX];

int n,a[2*MAX],h[2*MAX],nr,pos[MAX],c[2*MAX][18];
bool was[MAX];

void dfs(int x,int k){
    a[nr] = x;
    h[nr] = k;
    nr++;
    for(int i=0;i<g[x].size();i++)
    {
        dfs(g[x][i],k+1);
        a[nr] = x;
        h[nr] = k;
        nr++;
    }
}

void rmq(){
    for(int i=0;i<nr;i++) c[i][0] = i;
    for(int j=1;(1<<j)<=nr;j++)
    for(int i=0;i+(1<<j)<=nr;i++)
    if( h[ c[i][j-1] ] < h[ c[i+(1<<(j-1))][j-1] ] ) c[i][j] = c[i][j-1]; else
    c[i][j] = c[i+(1<<(j-1))][j-1];

  /*  for(int i=0;i<=20;i++)
    {
        for(int j=0;j<=5;j++)printf("%d ",a[ c[i][j] ]); printf("\n"); } */
}

int main(){
    int m,x,y,k;
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
        scanf("%d %d",&n,&m);

        for(int i=2;i<=n;i++)
        {
            scanf("%d ",&x);
            g[x].push_back(i);
        }
    dfs(1,0);
    rmq();
    for(int i=0;i<nr;i++)
    if( !was[ a[i] ] )
    {
        pos[ a[i] ] = i;
        was[ a[i] ] = 1;
    }

  //  for(int i=0;i<nr;i++)printf("%d ",a[i]); printf("\n");
  //  for(int i=0;i<nr;i++)printf("%d ",h[i]); printf("\n");
  //  for(int i=1;i<=n;i++)printf("%d ",pos[i]); printf("\n");
        while(m--)
        {
            scanf("%d %d",&x,&y);
            x = pos[x];
            y = pos[y];
            k = log(y-x+1)/log(2);
            if( h[ c[x][k] ] < h[ c[y-(1<<k)+1][k] ]) printf("%d\n",a[ c[x][k] ]); else printf("%d\n",a[ c[y-(1<<k)+1][k] ]);
        }
    return 0;
}