Advertisement
Guest User

Untitled

a guest
May 20th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <string>
  4. #include <algorithm>
  5. #include <map>
  6. #include <sstream>
  7. #include <functional>
  8. #include <cassert>
  9.  
  10. using namespace std;
  11.  
  12. template <class T>
  13. struct heap { // max heap
  14.     vector<T> _data;
  15.  
  16.  
  17.     void _sift_up(int i) {
  18.         if (i < 1) return;
  19.         int parent = (i-1)/2;
  20.         if (_data[parent] < _data[i]) {
  21.             swap(_data[parent], _data[i]);
  22.             _sift_up(parent);
  23.         }
  24.     }
  25.  
  26.     void _sift_down(int i) {
  27.         int l = (i+1)*2-1, r = (i+1)*2;
  28.         int index;
  29.         if (l < _data.size() && r < _data.size()) {
  30.             index = (_data[l] > _data[r]) ? l : r;
  31.         }
  32.         else if (l < _data.size()) index = l;
  33.         else if (r < _data.size()) index = r;
  34.         else {
  35.             return;
  36.         }
  37.         // THIS
  38.         if (_data[i] < _data[index]) {
  39.             swap(_data[i], _data[index]);
  40.             _sift_down(index);
  41.         }
  42.         // THIS ^^^^^^^^^^^^^^^^^^^^
  43.     }
  44.  
  45.     heap() {
  46.     }
  47.     void extract(){
  48.         if (_data.size() == 0) return;
  49.         if (_data.size() == 1) {
  50.             _data.erase(_data.begin());
  51.             return;
  52.         }
  53.         swap(_data[_data.size()-1], _data[0]);
  54.         _data.erase(_data.begin() + _data.size() -1);
  55.         _sift_down(0);
  56.     }
  57.  
  58.     T get() {
  59.         return _data[0];
  60.     }
  61.  
  62.     void insert(const T & obj) {
  63.         _data.push_back(obj);
  64.         _sift_up(_data.size()-1);
  65.     }
  66. };
  67.  
  68. int main() {
  69.     int n;
  70.     cin >> n;
  71.     heap<int> h;
  72.     for(auto i = 0; i < n; i++) {
  73.         string s;
  74.         cin >> s;
  75.         if (s == "Insert") {
  76.             int value;
  77.             cin >> value;
  78.             h.insert(value);
  79.         }
  80.         else {
  81.             cout << h.get() << "\n"; h.extract();
  82.         }
  83.     }
  84.  
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement