Cod sursa(job #1166171)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 3 aprilie 2014 12:21:05
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
using namespace std;

int heap[200200],val[200200],poz[200200],Nr,lungime;

void up_heap(int nod) {

    while( nod/2 && (val[heap[nod/2]]>val[heap[nod]]) ) {
        swap(heap[nod],heap[nod/2]);
        poz[heap[nod]]=nod;
        poz[heap[nod/2]]=nod/2;
        nod/=2;
    }
}

void down_heap(int nod) {

    int k=0;
    while(nod!=k) {
        k=nod;
        if(2*k<=lungime && val[heap[nod]]>val[heap[2*k]])
            nod=2*k;
        if(2*k+1<=lungime && val[heap[nod]]>val[heap[2*k+1]])
            nod=2*k+1;
        swap(heap[nod],heap[k]);
        poz[heap[nod]]=nod;
        poz[heap[k]]=k;

        }
}

int main() {

    ifstream in("heapuri.in");
    ofstream out("heapuri.out");
    int N,tip,x,i;
    in>>N;
    for(i=1;i<=N;i++) {
        in>>tip;
        if(tip==3)
            out<<val[heap[1]]<<'\n';
        if(tip==1){
            in>>x;
            val[++Nr]=x;
            heap[++lungime]=Nr;
            poz[Nr]=lungime;
            up_heap(lungime);
        }
        if(tip==2) {
            in>>x;
            val[x]=-1;
            up_heap(poz[x]);
            poz[heap[1]]=0;
            heap[1]=heap[lungime--];
            poz[heap[1]]=1;
            down_heap(1);

        }
    }

    in.close();
    out.close();
    return 0;

}