Cod sursa(job #330174)

Utilizator xtremespeedzeal xtreme Data 9 iulie 2009 01:35:56
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream.h>
#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 cheie,aux;
      cheie=numere[heap[nod]];
      while(nod>1 && cheie<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]]=nodfiu;
                      noduri[heap[nodfiu]]=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     {numere[var]=-1;
                            urca(noduri[var]);
                            noduri[heap[1]]=0;
                            heap[1]=heapnum--;
                            noduri[heap[1]]=1;
                            if(heapnum>1)  coboara(1);
                            }
                   }
               }
    fclose(stdin);fclose(stdout);
    return 0;
    }