Cod sursa(job #1810108)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 19 noiembrie 2016 16:42:38
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
//Heapuri

#include <fstream>

using namespace std;

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

#define maxDim 400500
#define maxVal 1000000000

long long N, i;
long long op, x;
long long k; //dimensiunea heap-ului
long long ins, k1;
long long Heap[maxDim]; //structura de Heap
long long Inserat[maxDim]; //retin cand a fost inserat fiecare element
long long Poz[maxDim]; //corespondenta intre Heap si Inserat

void insereaza() {
    Heap[++k] = x;
    Inserat[++ins] = x;
    Poz[x] = k;
    k1 = k;
    while(Heap[k1/2] > Heap[k1] && k1 > 1) {
        swap(Heap[k1/2], Heap[k1]);
        swap(Poz[Heap[k1/2]], Poz[Heap[k1]]);
        k1 /= 2;
    }
}

void sterge() {
    Heap[Poz[Inserat[x]]] = Heap[k--];
    k1 = k;

    while(Heap[k1/2] > Heap[k1] && k1 > 1) {
        swap(Heap[k1/2], Heap[k1]);
        swap(Poz[Heap[k1/2]], Poz[Heap[k1]]);
        k1 /= 2;
    }

    while((Heap[k1] > Heap[2*k1 + 1] || Heap[k1] > Heap[2*k1]) && k1 < k) {
        if(Heap[k1] > Heap[2*k1 + 1] && Heap[k1] > Heap[2*k1]) {
            if(Heap[2*k1 + 1] > Heap[2*k1]) {
                swap(Heap[2*k1], Heap[k1]);
                swap(Poz[Heap[2*k1]], Poz[Heap[k1]]);
                k1 = 2*k1;
            }
            else {
                swap(Heap[2*k1 + 1], Heap[k1]);
                swap(Poz[Heap[2*k1 + 1]], Poz[Heap[k1]]);
                k1 = 2*k1 + 1;
            }
        }
        else if(Heap[k1] > Heap[2*k1]) {
            swap(Heap[2*k1], Heap[k1]);
            swap(Poz[Heap[2*k1]], Poz[Heap[k1]]);
            k1 = 2*k1;
        }
        else {
            swap(Heap[2*k1 + 1], Heap[k1]);
            swap(Poz[Heap[2*k1 + 1]], Poz[Heap[k1]]);
            k1 = 2*k1 + 1;
        }
    }
}

void afiseazaMinim() {
    fout<<Heap[1]<<'\n';
}

int main()
{
    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) afiseazaMinim();
    }

    return 0;
}