Cod sursa(job #2438839)

Utilizator andra1782Andra Alazaroaie andra1782 Data 14 iulie 2019 02:55:42
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#define MAXN 100000
#define MAXH 18
FILE *fin,*fout;
int n,v[MAXN+1],next[MAXN+1];
int k,fap[MAXN+1],log2[2*MAXN-1],p2[2*MAXN-1];

struct{
  int nod,h;
}e[2*MAXN-1][MAXH];

void dfs(int nod, int ha){
  if(!fap[nod])
    fap[nod]=k;
  e[k][0].nod=nod;
  e[k++][0].h=ha;
  int i=v[nod];
  while(i){
    dfs(i,ha+1);
    e[k][0].nod=nod;
    e[k++][0].h=ha;
    i=next[i];
  }
}

void rmq(){
  for(int p=1; p<MAXH; p++)
    for(int i=0; i+(1<<p)<=k; i++){
      e[i][p].nod=e[i][p-1].nod;
      e[i][p].h=e[i][p-1].h;
      if(e[i][p].h>e[i+(1<<(p-1))][p-1].h){
        e[i][p].nod=e[i+(1<<(p-1))][p-1].nod;
        e[i][p].h=e[i+(1<<(p-1))][p-1].h;
      }
    }
}

void log(int k){
  for(int i=2; i<k; i++){
    log2[i]=log2[i/2]+1;
    p2[i]=(1<<log2[i]);
  }
}

int lca(int x, int y){
  if(x==y)
    return e[x][0].nod;
  if(x>y){
    int aux=x;
    x=y;
    y=aux;
  }
  int l=log2[y-x+1],p=p2[y-x+1];
  if(e[x][l].h<e[y-p+1][l].h)
    return e[x][l].nod;
  return e[y-p+1][l].nod;
}

int main(){
  fin=fopen("lca.in","r");
  fout=fopen("lca.out","w");
  int m,i,parinte,x,y;

  fscanf(fin,"%d%d",&n,&m);
  for(i=2; i<=n; i++){
    fscanf(fin,"%d",&parinte);
    next[i]=v[parinte];
    v[parinte]=i;
  }
  dfs(1,0);
  rmq();
  log(k);
  for(i=0; i<m; i++){
    fscanf(fin,"%d%d",&x,&y);
    fprintf(fout,"%d\n",lca(fap[x],fap[y]));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}