본문 바로가기
BOJ Review/Algorithms

[BOJ 11279] MaxHeap

by achrxme 2023. 9. 7.
#include <iostream>

using namespace std;

void MaxHeapify(int A[], int heap_size, int i)
{
    int left = 2*i;
    int right = 2*i + 1;

    int largest;
    if(left<=heap_size and A[left] > A[i]) largest = left;
    else largest = i;

    if(right<=heap_size and A[right]>A[largest]) largest = right;

    if(largest != i){
        int temp = A[i];
        A[i] = A[largest];
        A[largest] = temp;
        MaxHeapify(A, heap_size,largest);
    }
}

void BuildMaxHeap(int A[], int heap_size){
    for(int i=heap_size/2; i>=1; i--){
        MaxHeapify(A, heap_size, i);
    }

}

void HeapIncreaseKey(int A[], int i, int key){
    A[i] = key;
    while(i > 1 and A[i/2] < A[i]){
        int temp = A[i];
        A[i] = A[i/2];
        A[i/2] = temp;
        i = i/2;
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    int N; cin >> N;

    int A[100001];
    A[0] = -1;

    int heap_size = 0;
    for(int n=0; n<N; n++){
        int in; cin >> in;
        if(in==0) {
            if(heap_size==0) cout << 0 << '\n';
            else{
                cout << A[1] << '\n';
                A[1] = A[heap_size--];
                MaxHeapify(A, heap_size, 1);
            }
        }
        else {
            A[++heap_size] = -1;
            HeapIncreaseKey(A, heap_size, in);
        }
    }

    return 0;
}

'BOJ Review > Algorithms' 카테고리의 다른 글

[C++ Data Structure] Stack 구현  (0) 2023.08.31
[BOJ] 13241. Euclidean algorithm  (0) 2023.08.21