Cod sursa(job #1042375)

Utilizator Athena99Anghel Anca Athena99 Data 26 noiembrie 2013 22:43:34
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

const int nmax= 200000;

int n, l;
int v[nmax+1], a[nmax+1], p[nmax];

void swap( int x, int y ) {
    int aux= v[x];
    v[x]= v[y];
    v[y]= aux;

    p[v[x]]= x;
    p[v[y]]= y;
}

void insert ( int x ) {
    for ( ; x/2>=0 && a[v[x]]<a[v[x/2]]; x/=2 ) {
        swap(x, x/2);
    }
}

void del ( int p1 ) {
    int p2= 0;
    while ( p1!=p2 ) {
        p2= p1;
        if ( 2*p2<=l && a[v[p1]]>a[v[2*p2]] ) {
            p1= p2*2;
        }
        if ( 2*p2+1<=l && a[v[p1]]>a[v[2*p2+1]] ) {
            p1= p2*2+1;
        }

        swap(p1, p2);
    }
}

int main(  ) {
    int m;
    fin>>m;
    for ( ; m>0; --m ) {
        int k;
        fin>>k;
        if ( k==3 ) {
            fout<<a[v[1]]<<"\n";
        } else {
            int x;
            fin>>x;
            if ( k==1 ) {
                ++n;
                a[n]= x;
                ++l;
                v[l]= n;
                p[n]= l;
                insert(l);
            } else {
                a[x]= -1;
                insert(p[x]);
                p[v[1]]= 0;
                v[1]= v[l];
                --l;
                p[v[1]]= 1;
                if ( l>=2 ) {
                    del(1);
                }
            }
        }
    }

    return 0;
}