Cod sursa(job #2293133)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 30 noiembrie 2018 16:27:02
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.72 kb

#include <stdio.h>

#include <map>

 

using namespace std;

 

map <int, int> poz;

 

void interschimba(int &a, int &b) {

    int aux = a;

    a = b;

    b = aux;

}

 

void sus(int pos, int *heap) {

    while (pos > 1 && heap[pos] < heap[pos / 2]) {

        interschimba(poz[heap[pos]], poz[heap[pos / 2]]);

        interschimba(heap[pos], heap[pos / 2]);

        pos = pos / 2;

    }

}

 

void jos(int pos, int *heap, int dim_heap) {

    while (true) {

        // daca nu are fii inseamna ca e pe pozitia corecta (avand in vedere ca valoarea de unde a venit era mai mica)

        if (pos * 2 > dim_heap)

            return;

        if (pos * 2 == dim_heap) { // are doar un fiu

            if (heap[pos] > heap[pos * 2]) {

                interschimba(poz[heap[pos]], poz[heap[pos * 2]]);

                interschimba(heap[pos], heap[pos * 2]);

                pos *= 2;

            }

            else

                return;

        }

        else { // daca a ajuns pana aici inseamna ca are 2 fii

            int min_fiu_pos = pos * 2; // presupunem ca fiul stang e mai mic

            if (heap[pos * 2] > heap[pos * 2 + 1])

                min_fiu_pos++;  // al doilea fiu este cel cu care trebuie sa schimbam (min_fiu_pos++ echivalent cu min_fiu_pos = pos * 2 + 1)

            if (heap[pos] > heap[min_fiu_pos]) {

                interschimba(poz[heap[pos]], poz[heap[min_fiu_pos]]);

                interschimba(heap[pos], heap[min_fiu_pos]);
		pos *= 2;

            }

            else

                return;

        }

    }

}

 

void insert_heap(int valoare, int *heap, int &dim_heap) {

    dim_heap++;

    heap[dim_heap] = valoare;

    poz[heap[dim_heap]] = dim_heap;

    sus(dim_heap, heap);

}

 

void delete_heap(int pos, int *heap, int &dim_heap) {

    interschimba(heap[pos], heap[dim_heap]);

    // reactualizam pozitia dupa interschimbare;

    poz[heap[pos]] = pos;

    dim_heap--;

    jos(pos, heap, dim_heap);

}

 

int main() {

	freopen("heapuri.in", "r", stdin);

	freopen("heapuri.out", "w", stdout);

	int n, cod, x, dim_heap = 0, numere_inserate = 0;

	scanf("%d", &n);

	int heap[n + 1], cronologie[n + 1];

	for (int i = 0; i < n; i++) {

        scanf("%d", &cod);

        if (cod == 3)

            printf ("%d\n", heap[1]);

        else {

            scanf("%d", &x);

            if (cod == 1) {

                insert_heap(x, heap, dim_heap);

                cronologie[numere_inserate++] = x;

            }

            else

                delete_heap(poz[cronologie[x - 1]], heap, dim_heap);

        }

	}

	return 0;

}