Cod sursa(job #1613998)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 25 februarie 2016 19:07:00
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define DIM 200005

using namespace std;

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

int N,nr,a,b,M;
int H[DIM],poz[DIM],A[DIM];

void up(int x){
    int c=x,p=x/2;

    while(p>=1 && A[H[c]] < A[H[p]]){
        swap(H[c],H[p]);
        swap(poz[H[p]],poz[H[c]]);
        c=p;
        p/=2;
    }
}

void down(int x){
    int p=x,c=2*p;

    while(c<=nr){
        if(c+1<=nr && A[H[c+1]] < A[H[c]])
            c++;
        if(A[H[c]] < A[H[p]]){
            swap(H[c],H[p]);
            swap(poz[H[c]],poz[H[p]]);
            p=c;
            c*=2;
        }
        else
            break;
    }

}

void insert(int x){
    H[++nr]=x;
    poz[x]=nr;
    up(nr);
}
void extract(int x){
    A[x]=-1;
    up(poz[x]);
    swap(H[1],H[nr]);
    poz[H[1]]=1;
    nr--;
    down(1);
}

int main(){

    fin >> N;

    while(N--){

        fin >> a;

        if(a==1){
            fin >> A[++M];
            insert(M);
            continue;
        }
        if(a==2){
            fin >> b;
            extract(b);
            continue;
        }
        fout << A[H[1]] << "\n";

    }

    fin.close();fout.close();

    return 0;

}