Cod sursa(job #777509)

Utilizator ion824Ion Ureche ion824 Data 12 august 2012 15:46:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
using namespace std;
typedef struct lnod{
        int vf;
        struct lnod *next;
        }*Nod;
Nod a[100005];
int e[200010],h[200010],f[100005],vf;
int lg[200010],rmq[20][200010];

void add(int x,int y){
     Nod p=new lnod;
     p->vf=y;
     p->next=a[x];
     a[x]=p;
     }

void dfs(int nod,int lev){
     h[++vf]=lev;
     e[vf]=nod;
     f[nod]=vf;
     for(Nod p=a[nod];p;p=p->next)
      {
       dfs(p->vf,lev+1);
       h[++vf]=lev;
       e[vf]=nod;       
      }   
     }

void RMQ(){
     int i,j,l;
     for(i=2;i<=vf;++i)lg[i]=lg[i>>1]+1;
     for(i=1;i<=vf;++i)rmq[0][i]=i;
     
     for(i=1;(1<<i)<vf;++i)
       for(j=1;j+(1<<i)-1<=vf ;++j)
         {
          l=1<<(i-1);
          rmq[i][j]=rmq[i-1][j];               
          if(h[rmq[i-1][j+l]] < h[rmq[i][j]])
           rmq[i][j]=rmq[i-1][j+l];             
         }               
     }

int main(void){
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    int N,M,i,x,y,v,w,l,dif,sh,rs;
    fin>>N>>M;
    for(i=2;i<=N;++i){ fin>>x; add(x,i); }
    dfs(1,0);
    RMQ();
    while(M--)
    {
     fin>>x>>y;         
     v=f[x]; w=f[y];
     if(v>w){ dif=v; v=w; w=dif; } 
     dif=w-v+1;
     l=lg[dif];  
     sh=dif-(1<<l);
     rs=rmq[l][v];
     if(h[rs]>h[rmq[l][v+sh]])
       rs=rmq[l][v+sh];
     fout<<e[rs]<<'\n';     
    }    
 return 0;   
}