Cod sursa(job #252011)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 3 februarie 2009 19:37:46
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>

using namespace std;

int val[200010];
int loc[200010];
int poz[200010],N,a,b;
int numar,num;

void sch(int &a,int &b)
{
     int aux=a;
     a=b;
     b=aux;
}

void ins()
{
     int i=numar;
     val[numar]=b;
     loc[numar]=num;
     poz[num++]=numar;
     numar++;
     while (i!=1 && val[i>>1]>val[i])
     {
          sch(val[i],val[i>>1]);
          sch(poz[loc[i]],poz[loc[i>>1]]);
          sch(loc[i],loc[i>>1]);
          i>>=1;
     }
}

void sterge()
{
     val[poz[b]]=val[numar-1];
     numar--;
     int i=poz[b],aux;
     val[numar]=0;
     while (1)
     {
          aux=i<<1;
          if (val[aux]>val[aux+1] && aux+1<numar)
               aux++;
          if (val[i]>val[aux] && aux<numar)
          {
               sch(val[i],val[aux]);
               sch(poz[loc[i]],poz[loc[aux]]);
               sch(loc[i],loc[aux]);
          }
          else
               break;
          i=aux;
     }
}

void citire()
{
     freopen ("heapuri.in","r",stdin);
     freopen ("heapuri.out","w",stdout);
     scanf ("%d",&N);
     numar=1;
     num=1;
     while (N)
     {
          scanf ("%d",&a);
          if (a==3)
               printf("%d\n",val[1]);
          else
          {
               scanf ("%d",&b);
               if (a==1)
                    ins();
               else
                    sterge();
          }
          N--;
     }
}

int main ()
{
     citire();
     return 0;
}