Cod sursa(job #1584302)

Utilizator mateialexandru25Matei Alexandru mateialexandru25 Data 29 ianuarie 2016 21:50:34
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

struct nod
{ int info;
  nod* urm;
};

nod * prim[100001];
int euler[200001];
int nivel[200001];
int first[100001];
int n,m,k;

inline void Add(nod*&prim,int x)
{ nod*p=new nod;
  p->info=x;
  p->urm=prim;
  prim=p;
}

void Euler(int x, int niv)
{  euler[++k]=x;
   nivel[k]=niv;
   if(first[x]==0) first[x]=k;
   for(nod* p=prim[x];p!=NULL;p=p->urm)
   {   Euler(p->info,niv+1);
       euler[++k]=x;
       nivel[k]=niv;
   }

}

int main()
{   int i,j,x,y,px,py,min,lca;
    fin>>n>>m;
    for(i=2;i<=n;i++) {fin>>x; Add(prim[x],i);}
    Euler(1,1);
    for(i=1;i<=m;i++)
    {  fin>>x>>y;
       px=first[x];py=first[y];
       if(px>py) {int aux=px; px=py;py=aux;}
       min=n+1;
       for(j=px;j<=py;j++)
          if(nivel[j]<min) {min=nivel[j];lca=euler[j];}
       fout<<lca<<"\n";

    }

    return 0;
}