Cod sursa(job #1841280)

Utilizator stefanmereutaStefan Mereuta stefanmereuta Data 5 ianuarie 2017 14:45:07
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MAX 200010

void move_up(int heap[], int ordine[], int pozitie[], int nod) {
    int aux;

    while (nod > 1 && ordine[heap[nod]] < ordine[heap[nod / 2]]) {
        aux = heap[nod];
        heap[nod] = heap[nod / 2];
        heap[nod / 2] = aux;

        aux = pozitie[heap[nod]];
        pozitie[heap[nod]] = pozitie[heap[nod / 2]];
        pozitie[heap[nod / 2]] = aux;

        nod /= 2;
    }
}

void move_down(int heap[], int n, int ordine[], int pozitie[], int nod) {
    int minim, aux;

    while (nod * 2 <= n) {
        if (nod * 2 == n || ordine[heap[nod * 2]] < ordine[heap[nod * 2 + 1]]) {
            minim = nod * 2;
        } else {
            minim = nod * 2 + 1;
        }

        if (ordine[heap[minim]] < ordine[heap[nod]]) {
            aux = heap[nod];
            heap[nod] = heap[minim];
            heap[minim] = aux;

            aux = pozitie[heap[nod]];
            pozitie[heap[nod]] = pozitie[heap[minim]];
            pozitie[heap[minim]] = aux;

            nod = minim;
        } else {
            break;
        }
    }
}

void add(int heap[], int &n, int ordine[], int pozitie[], int &nr, int val) {
    ordine[++nr] = val;
    heap[++n] = nr;
    pozitie[nr] = n;

    move_up(heap, ordine, pozitie, n);
}

void del(int heap[], int &n, int ordine[], int pozitie[], int &nr, int poz) {
    heap[pozitie[poz]] = heap[n--];
    pozitie[heap[pozitie[poz]]] = pozitie[poz];

    if (pozitie[poz] == 1 || heap[pozitie[poz] / 2] < heap[pozitie[poz]]) {
        move_down(heap, n, ordine, pozitie, pozitie[poz]);
    } else {
        move_up(heap, ordine, pozitie, pozitie[poz]);
    }
}

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

    int n, op, x, heap[MAX], n_heap = 0, ordine[MAX], pozitie[MAX], nr = 0;

    fin >> n;

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

        if (op == 3) {
            fout << ordine[heap[1]] << endl;
        } else {
            fin >> x;

            if (op == 1) {
                add(heap, n_heap, ordine, pozitie, nr, x);
            } else {
                del(heap, n_heap, ordine, pozitie, nr, x);
            }
        }
    }

    fin.close();
    fout.close();

    return 0;
}