Cod sursa(job #1206846)

Utilizator RathebaSerbanescu Andrei Victor Ratheba Data 11 iulie 2014 12:54:47
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
using namespace std;
#define MAX 200001
int v[MAX], poz[MAX], heap[MAX], n, nv, nh;
void add(int x);
void upheap(int nod);
void del(int x);
void downheap(int nod);
void schimba(int a, int b);
int main()
{
    int i, x, cod;
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d", &n);
    for(i=1; i<=n; i++){
        scanf("%d", &cod);
        if(cod==3) printf("%d\n", v[heap[1]]);
        else{
            scanf("%d", &x);
            if(cod==1) add(x);
            else del(x);
        }
    }
    return 0;
}
void add(int x){
    v[++nv] = x;
    heap[++nh] = nv;
    poz[nv] = nh;
    upheap(nh);
}
void upheap(int nod)
{
    if(nod==1) return;
    if(v[heap[nod]]<v[heap[nod/2]]){
        schimba(nod, nod/2);
        upheap(nod/2);
    }
}
void schimba(int a, int b){
    int aux;
    aux = heap[a]; heap[a] = heap[b]; heap[b] = aux;
    aux = poz[heap[a]]; poz[heap[a]] = poz[heap[b]]; poz[heap[b]] = aux;
}
void del(int x){
    int p = poz[x];
    schimba(p, nh);
    nh--;
    downheap(p);
}
void downheap(int nod){
    if(nod*2>nh) return;
    int fiumin = nod*2;
    if(nod*2+1<=nh and v[heap[fiumin]]>v[heap[nod*2+1]])
        fiumin++;
    if(v[heap[nod]]>v[heap[fiumin]]){
        schimba(nod, fiumin);
        downheap(fiumin);
    }
}