Cod sursa(job #1189832)

Utilizator usermeBogdan Cretu userme Data 23 mai 2014 17:40:28
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>

FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");

int h[20000001],d[20000001],si,n,poz[20000001],m;

inline void schimb(int i,int j){
    int aux=h[i];
    h[i]=h[j];
    h[j]=aux;
    poz[h[i]]=i;
    poz[h[j]]=j;
}

void up(int x){
    while ( d[h[x]]<d[h[(x+1)/3]]&&x>1 ){
        schimb(x,(x+1)/3);
        x=(x+1)/3;
    }
}

void down(int x){
    int top=x*3-1,mid=x*3,bot=x*3+1,lane=x;
    if ( d[h[top]]<d[h[lane]]&&top<=si )lane=top;
    if ( d[h[mid]]<d[h[lane]]&&mid<=si )lane=mid;
    if ( d[h[bot]]<d[h[lane]]&&bot<=si )lane=bot;
    if ( lane==x )return;
    schimb(lane,x);
    down(lane);
}

void ins(int x){
    h[++si]=x;
    poz[x]=si;
    up(si);
    down(si);
}

void del(int x){
    schimb(x,si);
    --si;
    down(x);
}

int main(){
    fscanf(f,"%d",&n);
    for ( int i=1;i<=n;++i ){
        int t;
        fscanf(f,"%d",&t);
        if ( t==1 ){
            int a;
            fscanf(f,"%d",&a);
            d[++m]=a;
            ins(m);
        }
        if ( t==2 ){
            int a;
            fscanf(f,"%d",&a);
            del(poz[a]);
        }
        if ( t==3 ){
            fprintf(g,"%d\n",d[h[1]]);
        }
    }
    return 0;
}