Cod sursa(job #1604101)

Utilizator AntoniooMacovei Antonio Antonioo Data 17 februarie 2016 22:52:49
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
int heap[200001], poz[200001], n;
void push(int x) {
    n++;
    heap[n]=x;
    int i = n;
    while(i > 1 && heap[i] < heap[i/2]) {
        swap(heap[i],heap[i/2]);
        swap(poz[n],poz[i/2]);
        i /= 2;
    }
}
void pop(int i) {
    int x = heap[i];
    while(i*2 <= n) {
        if(heap[i*2+1] == 0) {
            heap[i] = heap[i*2];
            i *= 2;
        }
        else {
            heap[i] = heap[i*2] <= heap[i*2+1] ? heap[i*2] : heap[i*2+1];
            i = heap[i*2] <= heap[i*2+1] ? i*2 : i*2+1;
        }
    }
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int k, cod, i, p, x;
    scanf("%d",&k);
    n=0;
    for(i=1, p=0;i<=k;i++) {
        scanf("%d",&cod);
        if(cod == 1) {
            scanf("%d",&x);
            p++;
            poz[p]=p;
            push(x);
        }
        if(cod == 2) {
            scanf("%d",&x);
            pop(poz[x]);
        }
        if(cod == 3) {
            printf("%d\n",heap[1]);
        }
    }
    return 0;
}