Cod sursa(job #1577158)

Utilizator serban.cobzacCobzac Serban serban.cobzac Data 23 ianuarie 2016 11:53:49
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#define dmax 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int n, poz[dmax], nrUlt; //poz=pozitia in heap a elem cu nr de ordine i
struct elem{ int inf, nr;}; //nr=nr de ordine a elem
elem h[dmax];

void inserare(int);
void combinare(int);
void stergereX(int);

int main(){
    int operatie, x, m;
    fin>>m;
    for(int i=1; i<=m; ++i){
        fin>>operatie;
        if(operatie==1){
            fin>>x;
            inserare(x);
        }
        else    if(operatie==2){
                    fin>>x;
                    stergereX(x);
                }
                else fout<<h[1].inf<<'\n';
    }
    fout.close();
    return 0;
}

void inserare(int inf){
    int fiu, tata;
    fiu=++n; tata=fiu/2;
    while(tata>0 && h[tata].inf>inf){
        h[fiu]=h[tata];
        poz[h[fiu].nr]=fiu;
        fiu=tata;
        tata=tata/2;
    }
    h[fiu].inf=inf;
    h[fiu].nr=++nrUlt;
    poz[nrUlt]=fiu;
}

void combinare(int i){
    int inf=h[i].inf, tata=i, fiu=2*i;
    while(fiu<=n){ //cat timp mai exista fii
        if(fiu+1<=n && h[fiu].inf>h[fiu+1].inf) ++fiu; //fiu indica cel mai mic dintre fii
        if(h[fiu].inf<inf){ //promovez pe cel mai mic dintre fii
            h[tata]=h[fiu];
            poz[h[tata].nr]=tata;
            tata=fiu;
            fiu=2*tata;
        }
        else break; //am gasit locul, ies
    }
    h[tata].inf=inf;
    h[tata].nr=++nrUlt;
    poz[nrUlt]=tata;
}

void stergereX(int nr){
    h[poz[nr]]=h[n--];
    combinare(poz[nr]);
}