Cod sursa(job #1584548)

Utilizator VladuZ1338Vlad Vlad VladuZ1338 Data 30 ianuarie 2016 11:35:23
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <cmath>
#include <iostream>
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 nmin[3501][3501];
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,lca;
    fin>>n>>m;
    for(i=2;i<=n;i++) {fin>>x; Add(prim[x],i);}
    Euler(1,1);
    for (i=1; i<=k; i++)
    {
        nmin[i][i]=i;
        for (j=i+1; j<=k; j++)
        {
            if (nivel[nmin[i][j-1]]<nivel[j])
                nmin[i][j]=nmin[i][j-1];
            else nmin[i][j]=j;
        }
    }
    cout << sizeof (nmin)/1024.0/1024.0;
    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;}
       /*for(j=px;j<=py;j++)
          if(nivel[j]<min) {min=nivel[j];lca=euler[j];}*/
        lca=euler[nmin[px][py]];
       fout<<lca<<"\n";

    }

    return 0;
}