Cod sursa(job #1048242)

Utilizator hevelebalazshevele balazs hevelebalazs Data 5 decembrie 2013 17:51:55
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define N 200000
int A[N],*a=A-1;
int P[N],*p=P-1;
int PB[N],*pb=PB-1;
int s=0,C=0;
void push(int x){
    int i=++s;
    while(i>1&&a[i>>1]>x){
        a[i]=a[i>>1];
        p[pb[i>>1]]=i;
        pb[i]=pb[i>>1];
        i>>=1;
        }
    p[++C]=i;
    pb[i]=C;
    a[i]=x;
    }
void del(int x){
    int i=p[x];
    a[i]=a[s];
    pb[i]=pb[s];
    p[pb[s]]=i;
    s--;
    int s2=s>>1;
    while(i<=s2){
        int l=i<<1,r=l+1,m;
        m=(l<=s&&a[l]<a[i])?l:i;
        m=(r<=s&&a[r]<a[m])?r:m;
        if(m==i)return;
        a[i]^=a[m]^=a[i]^=a[m];
        p[pb[i]]=m;
        p[pb[m]]=i;
        pb[i]^=pb[m]^=pb[i]^=pb[m];
        i=m;
        }
    }

int main(){
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int n,x,y;
    scanf("%i",&n);
    fr(i,0,n){
        scanf("%i",&x);
        if(x==3) printf("%i\n",a[1]);
        else{
            scanf("%i",&y);
            if(x==1) push(y);
            else del(y);
            }
        }
    return 0;
    }