Cod sursa(job #235826)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 25 decembrie 2008 22:58:49
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
const int NMAX=200002;
int H[NMAX],nr,N,a[NMAX],na,poz[NMAX];
void add(int x){
     a[++na]=x;
     H[++nr]=na;
     int n=nr;
     while (n>1 && x<a[H[n/2]]){
           H[n]=H[n/2];
           poz[H[n]]=n;
           n/=2;}
     H[n]=na;
     poz[na]=n;
     }
void del(int n){
     int Son,aux;
     H[n]=H[nr--];
     poz[H[n]]=n;
     if (2*n<=nr){
       Son=2*n;
       if (Son<nr && a[H[Son+1]]<a[H[Son]])
        ++Son;
       if (a[H[n]]<a[H[Son]]) Son=0;}
     else Son=0;
     while (Son){
       poz[H[Son]]=n;poz[H[n]]=Son;
       aux=H[n];H[n]=H[Son];H[Son]=aux;
       n=Son;
       if (2*n<=nr){
       Son=2*n;
       if (Son<nr && a[H[Son+1]]<a[H[Son]])
        ++Son;
       if (a[H[n]]<a[H[Son]]) Son=0;}
       else Son=0;
       }
     }
int main(){
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&N);
    int t,x;
    while (N--){
          scanf("%d",&t);
          if (t!=3) scanf("%d",&x);
          switch (t){
           case 1: add(x);break;
           case 2: del(poz[x]);break;
           case 3: printf("%d\n",a[H[1]]);break;
           };
          }
    return 0;
}