Advertisement
Mlxa

Index-Heap { Push, Pop, Modify }

May 1st, 2018
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. template<class T = int>
  5. struct MinHeap {
  6.     const T _INFINTY = -1;
  7.     vector<T> val;
  8.     unordered_map<T, size_t> pos;
  9.     MinHeap() {
  10.         val = { _INFINTY };
  11.         pos.clear();
  12.     }
  13.     int size() { return int(val.size()) - 1; }
  14.     void swap_all(size_t i, size_t j) {
  15.         swap(val[i], val[j]);
  16.         swap(pos[val[i]], pos[val[j]]);
  17.     }
  18.     void push_up(size_t i) {
  19.         for(; val[i] < val[i >> 1]; i >>= 1)
  20.             swap_all(i, i >> 1);
  21.     }
  22.     void push_down(size_t i) {
  23.         for (size_t heap_size = size();
  24.             (i << 1) < heap_size && val[i] > val[i << 1];
  25.             i <<= 1)
  26.             swap_all(i, i << 1);
  27.     }
  28.     void modify(const T& old_val, const T& new_val) {
  29.         size_t i = pos[old_val];
  30.         val[i] = new_val;
  31.         push_up(i);
  32.         push_down(i);
  33.     }
  34.     void push(const T& value) {
  35.         val.push_back(value);
  36.         pos[value] = size();
  37.         push_up(size());
  38.     }
  39.     T min() {
  40.         assert(size() > 0);
  41.         return val[1];
  42.     }
  43.     T pop() {
  44.         assert(size() > 0);
  45.         T return_val = min();
  46.         swap_all(1, size());
  47.         val.pop_back();
  48.         push_down(1);
  49.         return return_val;
  50.     }      
  51. };
  52.  
  53. bool test_heap() {
  54.     MinHeap<int> q;
  55.     q.push(3);
  56.     q.push(2);
  57.     if (q.min() != 2) return false;
  58.     q.modify(3, 1);
  59.     if (q.pop() != 1) return false;
  60.     if (q.pop() != 2) return false;
  61.     return true;
  62. }
  63.  
  64. int main() {
  65.     cout << (test_heap()? "May be a good heap." : "Bad heap.") << endl;
  66.     return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement