Cod sursa(job #2752998)

Utilizator slightlyNagy Tamas slightly Data 20 mai 2021 17:41:53
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include<iostream>
#include<vector>

using namespace std;

class Heap {
    private: 
        vector<int> A;

        int PARENT(int i) {
            return (i - 1) / 2;
        }
        int LEFT(int i) {
            return (2*i + 1);
        }
        int RIGHT(int i) {
            return (2*i + 2);
        }
        
        void heapify_down(int i) {
            int left = LEFT(i);
            int right = RIGHT(i);
            int largest = i;

            if (left < A.size() && A[left] < A[i]) {
                largest = left;
            }
            if (right < A.size() && A[right] < A[largest]) {
                largest = right;
            }
            if (largest != i) {
                swap(A[i], A[largest]);
                heapify_down(largest);
            }
        }

         void heapify_up(int i)
        {
            if (i && A[PARENT(i)] > A[i])
            {
                swap(A[i], A[PARENT(i)]);
                heapify_up(PARENT(i));
            }
        }
 
    public:
        void push(int value) {
            A.push_back(value);
            int index = A.size() - 1;
            heapify_up(index);
        }

        int min() {
            if (A.size() == 0) {
                return -1;
            } else {
                return A[0];
            }
        }

        void write() {
            cout << "Current list : \n";
            for (int i = 0; i < A.size(); i++) {
                cout << A[i] << "\n";
            }
            cout << "----------";
        }

        void pop() {
            A[0] = A.back();
            A.pop_back();
            heapify_down(0);
        }
};

int main() {
    Heap valami;
    valami.push(4);
    valami.push(7);
    valami.push(9);
    cout << "Current Min : " << valami.min() << "\n";
    valami.pop();
    valami.push(2);
    cout << "Current Min : " << valami.min() << "\n";
    valami.pop();
    cout << "Current Min : " << valami.min() << "\n";

    
    valami.write();
}