Cod sursa(job #1201960)

Utilizator azkabancont-vechi azkaban Data 26 iunie 2014 15:30:42
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <fstream>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
typedef struct celula {
                        long nod;
                        celula *next;
                       }*lista;

lista lda[100005];
long viz[100005],i,n,m,a,b,nr,sol(0),E[100013],H[100013],poz[100013],RMQ[20][100013],minpos[20][100013],j,k,aux;  
                     
void add(long val, lista &p)
{
  lista r= new celula;
  r->nod=val;
  r->next=p;
  p=r;  
} 

void dfs (long nod,long &sol) 
{
  viz[nod]=1;
  lista r=lda[nod];
  while (r){
            E[++sol]=nod;
            H[r->nod]=H[nod]+1;
            if (viz[r->nod]==0) dfs(r->nod,sol);
            r=r->next;
            }
  E[++sol]=nod;
  poz[nod]=sol;  
}

int main()
{
  
  cin>>n>>m;
  for (i=1;i<n;++i) {
                     cin>>a;
                     add(i+1,lda[a]);
                    }
 H[1]=1;
 dfs(1,sol);
 for (i=1;i<=sol;++i){
                      RMQ[0][i]=H[E[i]];
                      minpos[0][i]=i;
                     }
 for (i=1;(1<<i)<=sol;++i) 
         for (j=1;j+(1<<i)-1<=sol;++j) { 
                                        RMQ[i][j]=min(RMQ[i-1][j],RMQ[i-1][j+(1<<(i-1))]);
                                        if(RMQ[i][j]==RMQ[i-1][j]) minpos[i][j]=minpos[i-1][j];
                                                             else  minpos[i][j]=minpos[i-1][j+(1<<(i-1))];
                                        }                       
  for (i=1,k=0;i<=m;++i,k=0){
                            cin>>a>>b;
                            a=poz[a]; b=poz[b];
                            if (a>b) swap(a,b);
                            if (a==b) cout<<RMQ[0][a]<<"\n";
                                    else {
                                          for (aux=1; aux<=(b-a); aux*=2,++k); --k;
                                          if (min(RMQ[k][a],RMQ[k][b+1-(1<<k)])==RMQ[k][a]) cout<<E[minpos[k][a]]<<"\n";
                                                                                     else   cout<<E[minpos[k][b+1-(1<<k)]]<<"\n";
                                          }
                     }

 return 0;
}