Cod sursa(job #2079249)

Utilizator xkz01X.K.Z. xkz01 Data 30 noiembrie 2017 20:36:39
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<cstdio>
#include<algorithm>
#define f first
#define s second
using namespace std;
pair<int,int> heap[200002]; ///<element, al catelea a fost inserat>
int lgHeap=0;
bool removed[200002];
void heap_up(int poz){
    while (poz>1) {
        if (heap[poz].f<heap[poz/2].f) {swap(heap[poz], heap[poz/2]); poz/=2;}
            else break;
    }
}
void heap_down(int poz){
    while (2*poz<=lgHeap) {
        if (2*poz+1<=lgHeap){
            ///compar stanga-dreapta
            ///stanga e mai mica
            if ((heap[2*poz].f<heap[2*poz+1].f)&&(heap[2*poz].f<heap[poz].f)) {
                swap(heap[poz], heap[2*poz]);
                poz*=2; continue;
            } else
            ///dreapta e mai mica
            if ((heap[2*poz].f>heap[2*poz+1].f)&&(heap[2*poz+1].f<heap[poz].f)) {
                swap(heap[poz], heap[2*poz+1]);
                poz=2*poz+1; continue;
            }
        }
        else {
            ///compar doar cu stanga pt ca nu exista dreapta
            if (heap[2*poz].f<heap[poz].f) {
                swap(heap[poz], heap[2*poz]);
                poz*=2; continue;
            }
        }
    }
}
int findMin(){
    while (removed[heap[1].s]) {
        swap(heap[1], heap[lgHeap]);
        heap[lgHeap]=make_pair(0,0); lgHeap--;
        heap_down(1);
    }
    return heap[1].f;
}
int main(){
    int n, step, i, op, x;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d", &n);
    step=0;
    for (i=1;i<=n;i++) {
        scanf("%d", &op); if (op<3) scanf("%d", &x);
        switch(op){
            case 1: {heap[++lgHeap]=make_pair(x, ++step); removed[x]=false; heap_up(lgHeap); break;}
            case 2: {removed[x]=true; break;}
            case 3: {printf("%d\n", findMin()); break;}
        }
    }
    return 0;
}