Cod sursa(job #1713333)

Utilizator raluca1234Tudor Raluca raluca1234 Data 5 iunie 2016 12:45:23
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#define MAXN 200000

using namespace std;
int n, v[MAXN], heap[MAXN], poz[MAXN];

inline int tata(int nod){
    return (nod-1)/2;
}
inline int fiust(int nod){
    return nod*2+1;
}
inline int fiudr(int nod){
    return nod*2+2;
}
inline void swap(int p,int q){
    int aux;
    aux=heap[p];
    heap[p]=heap[q];
    heap[q]=aux;
    poz[heap[p]]=p;
    poz[heap[q]]=q;
}
inline void urcare(int p){
    while ((p>0)&&(v[heap[p]]<v[heap[tata(p)]])){
        swap(p, tata(p));
        p=tata(p);
    }
}
inline void coborare(int p){
    int f, fiu;
    f=1;
    while ((f) && (fiust(p)<n)){
        fiu=fiust(p);
        if ((fiudr(p)<n) && (v[heap[fiudr(p)]]<v[heap[fiu]]))
            fiu=fiudr(p);
        if (v[heap[fiu]]<v[heap[p]]){
            swap(p, fiu);
            p=fiu;
        }else
            f=0;
    }
}
inline void adauga(int p){
    heap[n]=p;
    poz[p]=n;
    n++;
    urcare(n-1);
}
inline void sterge(int p){
    heap[poz[p]]=heap[n-1];
    poz[heap[n-1]]=poz[p];
    n--;
    if ((poz[p]>0) && (v[heap[poz[p]]]<v[heap[tata(poz[p])]]))
        urcare(poz[p]);
    else
        coborare(poz[p]);
}
int main(){
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    int i, q, k, t, x;
    scanf("%d", &q);
    n=0; //numarul de noduri curente
    k=0; //cate elemente am citit
    for (i=1; i<=q; i++){
        scanf("%d", &t);
        if (t==3)
            printf("%d\n", v[heap[0]]);
        else{
            scanf("%d", &x);
            if (t==1){
                v[k]=x;
                adauga(k);
                k++;
            }else
                sterge(x-1);
        }
    }
    return 0;
}