Cod sursa(job #1182281)

Utilizator flore77Simion Florentin flore77 Data 5 mai 2014 20:10:23
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

template <typename T>
class Heap {
    T* values;
    int dimVect;
public:
    Heap(int capVect) {
        dimVect = 0;
        values = new T[capVect];
    }

    void pushUp(int poz) {
        int indice = (poz - 1) / 2;
        if (values[indice] > values[poz] && poz > 0) {
            T aux;
            aux = values[poz];
            values[poz] = values[indice];
            values[indice] = aux;
            pushUp(indice);
        }
    }

    void pushDown(int poz) {
        int indice;
        if (2 * poz + 2 > dimVect && 2 * poz + 1 > dimVect)
            return;
        else if (2 * poz + 2 > dimVect && 2 * poz + 1 <= dimVect)
            indice = 2 * poz + 1;
        else if (2 * poz + 2 <= dimVect && 2 * poz + 1 > dimVect)
            indice = 2 * poz + 2;
        else {
            if (values[2 * poz + 2] > values[2 * poz + 1])
                indice = 2 * poz + 1;
            else
                indice = 2 * poz + 2;
        }
        if (values[poz] > values[indice]) {
            T aux;
            aux = values[poz];
            values[poz] = values[indice];
            values[indice] = aux;
            pushDown(indice);
        }
    }

    void insert(T x) {
        values[dimVect] = x;
        pushUp(dimVect);
        dimVect++;
    }

    T peek() {
        return values[0];
    }

    void remove (T x) {
        int i;
        for (i = 0; i < dimVect; i++)
            if (values[i] == x)
                break;
        dimVect--;
        values[i] = values[dimVect];
        pushDown(i);
    }

    T extractMin() {
        dimVect--;
        T min = values[0];
        values[0] = values[dimVect];
        pushDown(0);
        return min;
    }

    ~Heap() {
        delete[] values;
    }
};

int main() {
    vector<int> numbers;
    ifstream in;
    in.open("heapuri.in");
    ofstream out;
    out.open("heapuri.out");
    int n, i, Op, x;
    in >> n;
    Heap<int> heap(n);
    for (i = 0; i < n; i++) {
        in >> Op;
        if (Op == 1) {
            in >> x;
            heap.insert(x);
            numbers.push_back(x);
        }
        else if (Op == 2) {
            in >> x;
            heap.remove(numbers[x-1]);
        }
        else {
            out << heap.peek() << "\n";
        }
    }
    in.close();
    out.close();
    return 0;
}