Cod sursa(job #415171)

Utilizator ucc_5Usurelu Catalin ucc_5 Data 10 martie 2010 22:59:18
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#define max_heap 200002
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

int h[max_heap],elem[max_heap],poz[max_heap],n,n1,x,op;

namespace ucc
{
  void swap (int x,int y)
  {
    poz[h[x]]=y;
    poz[h[y]]=x;
    std::swap (h[x],h[y]);
  }
}

inline int tata (int);
inline int fiu_st (int);
inline int fiu_dr (int);
inline int min ();

void up_heap (int k)
{
  while ((k>1) && (h[k]<h[tata(k)]))
  {
    ucc::swap (k,tata(k));
    k=tata(k);
  }
}

void down_heap (int k)
{
  int fiu;
  do 
  {
    fiu = 0;
    if (fiu_st(k) <= n) 
    {
     fiu = fiu_st(k);
      if (fiu_dr(k) <= n)
        if( h[fiu_dr(k)] < h[fiu_st(k)]) 
          fiu= fiu_dr(k);
      if (h[fiu] >= h[k]) // a ajuns pe pozitia corecta
        fiu = 0;
    }
    if (fiu) 
    {
      ucc::swap(k,fiu);  
      k=fiu;
    }
  } while (fiu);
}

void pop_heap (int k)
{
  h[k]=h[n];
  n--;
  if ((k>1) && (h[k]<h[tata(k)]))
    up_heap(k);
  else 
    down_heap (k);
}

int main ()
{
  f>>n1;
  for (int i=1; i<=n1; i++)
  {
    f>>op;
    switch (op)
    {
      case 1: 
        f>>x;
        elem[++elem[0]]=x; // elem - vector cu numere in ordinea inserarii lor
        n++;
        poz[x]=n;
        h[n]=x;
        up_heap (n);
        break;
      case 2:
        f>>x;
        pop_heap (poz[elem[x]]);
        break;
      case 3:
        g<<min()<<'\n';
    }
  }
  f.close (); g.close (); return 0;
}

inline int tata (int nod)
{
  return nod/2;
}

inline int fiu_st (int nod)
{
  return nod*2;
}

inline int fiu_dr (int nod)
{
  return nod*2+1;
}

inline int min ()
{
  return h[1];
}