Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct Heap
- {
- vector<int> v, heap_v, pos; ///v - значения, heap_v - куча индексов, pos - позиции в куче
- int n = 0;
- bool flag_; ///определитель кучи на максимум или минимум
- explicit Heap(bool flag){
- heap_v.resize(1);
- heap_v[0] = -1;
- flag_ = flag;
- }
- void heap_swap(int i, int j) {
- swap(pos[heap_v[i]], pos[heap_v[j]]);
- swap(heap_v[i], heap_v[j]);
- }
- bool is_valid_node(int i) {
- return i > 0 && i <= n;
- }
- bool is_valid_parent(int p, int c) {
- return is_valid_node(p) && is_valid_node(c) && (v[heap_v[p]] < v[heap_v[c]])^flag_;
- }
- void siftUp(int i)
- {
- int p = i / 2;
- while (is_valid_node(p) && !is_valid_parent(p, i)) {
- heap_swap(i, p);
- i = p;
- p = i / 2;
- }
- }
- void siftDown(int i) {
- int l = 2*i;
- while (l <= n){
- if (is_valid_parent(l+1, l)) l++;
- if (is_valid_parent(i, l)) break;
- else {
- heap_swap(i, l);
- i = l;
- l = 2*i;
- }
- }
- }
- void Insert(int new_el) {
- v.push_back(new_el);
- pos.push_back(n+1);
- heap_v.push_back(v.size()-1);
- n++;
- siftUp(n);
- }
- void Del(int i) {
- ///i = pos[i];
- swap(heap_v[i], heap_v[n]);
- heap_v.pop_back();
- n--;
- if(i <= n) {
- pos[heap_v[i]] = i;
- siftUp(i);
- siftDown(i);
- }
- }
- int Get(int i) { return v[heap_v[i]];}
- };
Advertisement
Add Comment
Please, Sign In to add comment