Cod sursa(job #1196823)

Utilizator bogdanmarin69Bogdan Marin bogdanmarin69 Data 9 iunie 2014 12:36:19
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 200001
int heap[MAX], nh, poz[MAX], ntot, n, v[MAX];
void adauga(int x);
void scoate(int x);
void schimba(int poza, int pozb);
void upheap(int nod);
void downheap(int nod);
int main()
{
    int i, op, x, j;
    freopen("heaprui.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d", &n);
    for(i=1; i<=n; i++){
        scanf("%d", &op);
        if(op==1){scanf("%d", &x);adauga(x);}
        if(op==2){scanf("%d", &x);scoate(x);}
        if(op==3){printf("%d\n", v[heap[1]]);}
    }
    return 0;
}
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 = 2*nod+1;
    if(v[heap[nod]]>v[heap[fiumin]]){
        schimba(nod, fiumin);
        downheap(fiumin);
    }
}
void upheap(int nod){
    if(nod==1) return;
    int tata = nod/2;
    if(v[heap[tata]]>v[heap[nod]]){
        schimba(tata, nod);
        upheap(tata);
    }
}
void adauga(int x){
    v[++ntot] = x;
    heap[++nh] = ntot;
    poz[ntot] = nh;
    upheap(nh);
}
void scoate(int x){
    int p = poz[x];
    schimba(poz[x], nh);
    nh--;
    downheap(p);
}
void schimba(int poza, int pozb){
    swap(heap[poza], heap[pozb]);
    swap(poz[heap[poza]], poz[heap[pozb]]);
}