DarkArtheme

B3

Apr 8th, 2021
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. template<class T>
  6. class heap{
  7. public:
  8.     void add(const T& value){
  9.         arr.push_back(value);
  10.         siftUp(arr.size() - 1);
  11.     }
  12.     T get(){
  13.         T value = arr[0];
  14.         arr[0] = arr.back();
  15.         arr.pop_back();
  16.         siftDown(0);
  17.         return value;
  18.     }
  19.     bool empty() { return arr.empty(); }
  20. private:
  21.     vector<T> arr;
  22.     void siftUp(size_t v){
  23.         if(v == 0){
  24.             return;
  25.         }
  26.         size_t p = (v - 1) / 2;
  27.         if(arr[p] > arr[v]){
  28.             swap(arr[p], arr[v]);
  29.             siftUp(p);
  30.         }
  31.     }
  32.     void siftDown(size_t v){
  33.         size_t l = 2 * v + 1, r = 2 * v + 2;
  34.         if(l >= arr.size()) {
  35.             return;
  36.         }
  37.         if(l == arr.size() - 1) {
  38.             r = l;
  39.         }
  40.         size_t i_min = arr[l] < arr[r] ? l : r;
  41.         if(arr[v] > arr[i_min]){
  42.             swap(arr[v], arr[i_min]);
  43.             siftDown(i_min);
  44.         }
  45.     }
  46. };
  47.  
  48. int main(){
  49.     heap<int> Heap;
  50.     string cmd;
  51.     while(cin >> cmd){
  52.         if(cmd == "ADD"){
  53.             int n;
  54.             cin >> n;
  55.             Heap.add(n * (-1));
  56.         } else if(cmd == "EXTRACT"){
  57.             if(Heap.empty()){
  58.                 cout << "CANNOT\n";
  59.             } else{
  60.                 //auto it = Set.begin();
  61.                 cout << Heap.get() * (-1) << endl;
  62.             }
  63.         } else if(cmd == "CLEAR"){
  64.             Heap = heap<int>();
  65.         }
  66.     }
  67.     return 0;
  68. }
  69.  
  70.  
Advertisement
Add Comment
Please, Sign In to add comment