Cod sursa(job #1814716)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 24 noiembrie 2016 13:54:01
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

#define DMAX 200005

int poz[DMAX];
int nrel, nrins;
int x;

struct HEAP{
    int val, poz;// pozitia pe care a fost inserat initial
}Heap[DMAX];

void insereaza(){

    nrel++;
    Heap[nrel].val = x;
    nrins++;
    Heap[nrel].poz = nrins;
    poz[nrins]= nrel;
    int k = nrel;

    while(Heap[k / 2].val > Heap[k].val && k >= 2){
        swap(Heap[k / 2], Heap[k]);
        swap(poz[Heap[k / 2].poz], poz[Heap[k].poz]);
        k /= 2;
    }
}

void sterge(){

    Heap[poz[x]] = Heap[nrel];
    poz[Heap[nrel].poz] = poz[x];
    nrel--;

    int k = poz[x];

    while(Heap[k / 2].val > Heap[k].val && k >= 2){
        swap(Heap[k / 2], Heap[k]);
        swap(poz[Heap[k / 2].poz], poz[Heap[k].poz]);
        k /= 2;
    }

    while((2 * k <= nrel && Heap[k].val > Heap[2 * k + 1].val) || (2 * k + 1 <= nrel && Heap[k].val > Heap[2 * k].val)){
        if(Heap[2 * k + 1].val > Heap[2 * k].val){
            swap(Heap[2 * k], Heap[k]);
            swap(poz[Heap[2 * k].poz], poz[Heap[k].poz]);
            k  = k * 2;
        } else {
            swap(Heap[2 * k + 1], Heap[k]);
            swap(poz[Heap[2 * k + 1].poz], poz[Heap[k].poz]);
            k = k * 2 + 1;
        }
    }
}

int main() {
    int N, i, op;
    fin>>N;
    for(i = 1; i <= N; ++i){
        fin>>op;

        if(op == 1) {
            fin>>x; insereaza();
        }
        if(op == 2) {
            fin>>x; sterge();
        }
        if(op == 3) {
            fout<<Heap[1].val<<'\n';
        }
    }

    return 0;
}