Cod sursa(job #991288)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 30 august 2013 11:23:02
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <vector>

inline unsigned PARENT(const unsigned x){ return x>>1; }
inline unsigned LEFT(const unsigned x){ return x<<1; }
inline unsigned RIGHT(const unsigned x){ return (x<<1)+1; }

int main(){
    std::ifstream fin("heapuri.in");
    std::ofstream fout("heapuri.out");

    unsigned n;
    fin>>n;

    std::vector<unsigned> values(n+1),heap(n+1),pos(n+1);
    unsigned nrval=0,heapsize=0;

    unsigned x;

    while(n--){
        char op; fin>>op;
        switch(op){
            case '1':
                fin>>x;
                ++nrval; ++heapsize;
                values[nrval]=x;
                //push to the heap
                heap[heapsize]=nrval;
                pos[nrval]=heapsize;

                for(unsigned curr=heapsize;PARENT(curr)>0;){
                    if(values[heap[curr]]<values[heap[PARENT(curr)]]){
                        unsigned temp=heap[curr];
                        heap[curr]=heap[PARENT(curr)];
                        heap[PARENT(curr)]=temp;

                        pos[heap[curr]]=curr;
                        curr=PARENT(curr);
                        pos[heap[curr]]=curr;
                    }
                    else break;
                }

                break;
            case '2':
                fin>>x;
                heap[pos[x]]=heap[heapsize];
                pos[heap[heapsize]]=pos[x];
                heapsize--;

                for(unsigned curr=pos[x];;){
                    unsigned which=curr,min=values[heap[curr]];
                    if(LEFT(curr)<=heapsize&&values[heap[LEFT(curr)]]<min){
                        which=LEFT(curr);
                        min=values[heap[which]];
                    }
                    if(RIGHT(curr)<=heapsize&&values[heap[RIGHT(curr)]]<min){
                        which=RIGHT(curr);
                        min=values[heap[which]];
                    }
                    if(which==curr) break;
                    else{
                        unsigned temp=heap[curr];
                        heap[curr]=heap[which];
                        heap[which]=temp;

                        pos[heap[curr]]=curr;
                        pos[heap[which]]=which;

                        curr=which;
                    }
                }

                break;
            case '3':
                fout<<values[heap[1]]<<'\n';
                break;
        }
    }
}