Cod sursa(job #240525)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 7 ianuarie 2009 20:43:40
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
long n,i,t,x,q,k,h[200000],nr[200000],poz[200000];

void down(long i){
   long fiu;
   while ((long)(i<<1)<=q){
     fiu=i<<1;
     if ((long)(fiu|1)<=q)
       if (h[fiu|1]<h[fiu])fiu|=1;
     if (h[fiu]<h[i]){
       swap(h[i],h[fiu]);
       swap(nr[i],nr[fiu]);
       poz[nr[i]]=i;
       poz[nr[fiu]]=fiu;
       i=fiu;
    }
    else break;
  }
}

void up(long i){
   long val=h[i],valnr=nr[i];
   while (i>1 && val<h[i>>1]){
      h[i]=h[i>>1];
      nr[i]=nr[i>>1];
      poz[nr[i]]=i;
      i>>=1;
   }
   h[i]=val;
   nr[i]=valnr;
   poz[nr[i]]=i;
}

int main(){
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%ld",&n);
    for (i=1;i<=n;++i){
        scanf("%ld",&t);
        if (t==3)printf("%ld\n",h[1]);
        else if (t==1){scanf("%ld",&x);h[++q]=x;nr[q]=++k;poz[k]=q;up(q);}
             else {scanf("%ld",&x);h[poz[x]]=h[q];q--;down(poz[x]);}
    }
return 0;
}