Cod sursa(job #238766)

Utilizator MciprianMMciprianM MciprianM Data 3 ianuarie 2009 11:34:08
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
#define MAXN 200009
using namespace std;
int ha[MAXN],hsize;
int poz[MAXN];
int ipoz[MAXN];
int n;
int c;
void insereaza(int x){
   hsize++;
   int p=hsize;
   ha[p]=x;
   poz[c]=hsize;
   ipoz[hsize]=c;
   while(ha[(p>>1)]>ha[p]){
     swap(ha[(p>>1)],ha[p]);
     swap(poz[ipoz[p]],poz[ipoz[p/2]]);
     swap(ipoz[p],ipoz[p/2]);
     p>>=1;
   }
}
void hf(int i){
  int minim,imin=-1;
  if(2*i<=hsize&&ha[2*i]<ha[i])
    minim=ha[2*i],imin=2*i;
  else minim=ha[i],imin=i;
  if(2*i+1<=hsize&&ha[2*i+1]<minim)
    minim=ha[2*i+1],imin=2*i+1;
  swap(ha[i],ha[imin]);
  swap(poz[ipoz[i]],poz[ipoz[imin]]);
  swap(ipoz[i], ipoz[imin]);
  if(imin!=i) hf(imin);
}
void extrmin(){
  ha[1]=ha[hsize];
  poz[ipoz[hsize]]=1;
  poz[ipoz[1]]=0;
  ipoz[1]=ipoz[hsize];
  ipoz[hsize]=0;
  hsize--;
  hf(1);
}
void sterge(int x){
  int p=poz[x];
  ha[p]=-1000000009;

  while(ha[(p>>1)]>ha[p]){
     swap(ha[(p>>1)],ha[p]);
     swap(poz[ipoz[p]],poz[ipoz[(p>>1)]]);
     swap(ipoz[p],ipoz[(p>>1)]);
     p>>=1;
   }
   extrmin();
}
int main(){
  ha[0]=-2000000000;
  int i, cod, x;
  ifstream f("heapuri.in");
  ofstream g("heapuri.out");
  f>>n;
  for(i=0;i<n;i++){
    f>>cod;
    if(cod==3)  g<<ha[1]<<'\n';
    else{
      f>>x;
      c++;
      if(cod==1){
        insereaza(x);
      }
      else sterge(x);
    }
  }
  f.close();
  g.close();
  return 0;
}