Cod sursa(job #330461)

Utilizator xtremespeedzeal xtreme Data 10 iulie 2009 01:43:36
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
/*
#include <iostream.h>                //fara STL
#include <stdio.h>
#define nmax 200001

long int n,heap[nmax],numere[nmax],noduri[nmax],var,heapnum,nrnum,i,tip;

void urca(long int nod)
      {long int aux;
       while(nod>1 && numere[heap[nod]]<numere[heap[nod/2]])
		    {aux=heap[nod];heap[nod]=heap[nod/2];heap[nod/2]=aux;
		    noduri[heap[nod]]=nod;
		    noduri[heap[nod/2]]=nod/2;
		    nod/=2;
		    }
      }
void coboara(long int nod)
     {long int nodfiu=0,aux;
      while(nod!=nodfiu)
		     {nodfiu=nod;
		      if(nodfiu*2<=heapnum && numere[heap[nod]]>numere[heap[nodfiu*2]]) nod=nodfiu*2;
		      if(nodfiu*2+1<=heapnum && numere[heap[nod]]>numere[heap[nodfiu*2+1]]) nod=nodfiu*2+1;
		      aux=heap[nod];heap[nod]=heap[nodfiu];heap[nodfiu]=aux;
		      noduri[heap[nod]]=nod;
		      noduri[heap[nodfiu]]=nodfiu;
             }
     }      
void del(long int nod)
     {heap[nod]=heap[heapnum--];
      urca(nod);coboara(nod);
     }
int main()
    {freopen("heapuri.in","r",stdin);freopen("heapuri.out","w",stdout);
    scanf("%ld",&n);
    for(i=1;i<=n;i++)
	       {scanf("%ld",&tip);
	        if(tip==3)  printf("%ld\n",numere[heap[1]]);
	        else
		           {scanf("%ld",&var);
		            if(tip==1)     {numere[++nrnum]=var;
		                            heap[++heapnum]=nrnum;
		                            noduri[nrnum]=heapnum;
		                            urca(heapnum);
                                    }
                    else            del(noduri[var]);
                   }
           }
    fclose(stdin);fclose(stdout);
    return 0;
    }
*/
#include <set>                 //cu STL
#define nmax 200001

using namespace std;  
multiset<int> heap;
int ndo[nmax],nrnum,i,n,tip,x;

int main()
    {freopen("heapuri.in","r",stdin);freopen("heapuri.out","w",stdout);
     scanf("%d",&n);
     for(i=1;i<=n;i++)
              {scanf("%d",&tip);
               if(tip==3)      printf("%d\n",*heap.begin());
               else           {scanf("%d",&x);
                               if(tip==1)     {heap.insert(x);
                                               ndo[++nrnum]=x;
                                              }
                               else            heap.erase(heap.find(ndo[x]));
                              }
               }
     fclose(stdin);fclose(stdout);
     return 0;
     }