Cod sursa(job #2071691)

Utilizator AnduRazvanMindrescu Andu AnduRazvan Data 20 noiembrie 2017 21:41:10
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#include <iostream>
using namespace std;
int poz1,poz2,z,n,m,x,y,pozmin, a[200001],b[200001][40],niv[200001],fr[200001];
struct nod
{ int info;
  nod *urm;
};
nod *gf[100001];
void Add(nod *&prim,int y)
{ nod *q=new nod;
  q->info=y;
  q->urm=prim;
  prim=q;
}
void DFS(int xx,int nivv)
{ z++;a[z]=xx;niv[z]=nivv;
    nod *p;
    for(p=gf[xx];p!=NULL;p=p->urm)
      {DFS(p->info,nivv+1);
      z++;a[z]=xx;niv[z]=nivv;}
}
void Matrix()
{ int i,j;
  for(i=1;i<=2*n-1;i++)
  b[i][0]=i;
  for(j=1;1<<j<=2*n-1;j++)
   for(i=1;i+(1<<j)<=2*n-1;i++)
     if(niv[b[i][j-1]]<niv[b[i+(1<<j)][j-1]]) b[i][j]=b[i][j-1];
     else b[i][j]=b[i+(1<<(j-1))][j-1];
}
int Put(int yy,int xx)
{ int p=1,c=0;
  while(p*2<=yy-xx+1)
  {p*=2;
  c++;}
    return c;
}
int main()
{ int i,j;
    FILE *f,*g,*h;
    f=fopen("lca.in","r");
    g=fopen("lca.out","w");
   // h=fopen("txt.out","w");
    fscanf(f,"%d %d",&n,&m);
    for(i=2;i<=n;i++)
    {fscanf(f,"%d",&x);
     Add(gf[x],i);
    }
    DFS(1,1);
    Matrix();


  /*   for(i=1;i<=2*n-1;i++)
       fprintf(h,"%d ",a[i]);
       fprintf(h,"\n");
      for(i=1;i<=2*n-1;i++)
       fprintf(h,"%d ",niv[i]);
       fprintf(h,"\n");
    for(i=1;i<=2*n-1;i++)
    {for(j=0;(1<<j)<=2*n-1;j++)
      fprintf(h,"%d ",b[i][j]);
     fprintf(h,"\n");
    }
    */
for(i=1;i<=2*n-1;i++)
  if(fr[a[i]]==0) fr[a[i]]=i;
    for(i=1;i<=m;i++)
    {fscanf(f,"%d %d",&x,&y);
       poz1=fr[x];
       poz2=fr[y];
     if(poz1>poz2) swap(poz1,poz2);
       z=Put(poz2,poz1);
     if(niv[b[poz1][z]]<=niv[b[poz2-(1<<z)+1][z]]) pozmin=b[poz1][z];
     else pozmin=b[poz2-(1<<z)+1][z];
     fprintf(g,"%d\n",a[pozmin]);
    }
    return 0;
}