Cod sursa(job #351020)

Utilizator mihaionlyMihai Jiplea mihaionly Data 26 septembrie 2009 16:05:02
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
using namespace std;
#define t(x) x/2
#define fs(x) 2*x
#define fd(x) 2*x+1
#define nmax 200001
struct Heap {int p,x;} H[nmax];
int P[nmax],n,cod,nr,m,pp,z;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
void up_up(int y)
 {
 while(t(y)>=1 && H[y].x<H[t(y)].x)
  {
  swap(H[y],H[t(y)]);
  P[H[y].p]=y;
  P[H[t(y)].p]=t(y);
  y=t(y);
  }
 }
void down(int y)
 {
 int fiu;
 while(fs(y)<=m)
  {
  fiu=fs(y);
  if(fd(y)<=m&&H[fd(y)].x<H[fs(y)].x)
   fiu=fd(y);
  if(H[fiu].x<H[y].x)
   {
   swap(H[fiu],H[y]);
   P[H[fiu].p]=fiu;
   P[H[y].p]=y;
   y=fiu;
   }
  else
   break;
  }
 }
int main()
 {
 f>>n;
 for(int i=1;i<=n;i++)
  {
  f>>cod;
  if(cod==1)
   {
   f>>H[++m].x;
   H[m].p=(++nr);
   P[H[m].p]=m;
   if(t(m)>=1&&H[m].x<H[t(m)].x)
    up_up(m);
   }
  else if(cod==2)
   {
   f>>pp;
   z=P[pp];
   swap(H[z],H[m]);
   P[H[z].p]=z;
   --m;
   if(t(z)>=1&&H[t(z)].x>H[z].x)
    {
    up_up(z);
    }
   else if(fs(z)<=m)
    {
    down(z);
    }
   }
   else
    {
    g<<H[1].x<<endl;
    }
   
  }
 return 0;
 }