Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #include <string>
- #include <algorithm>
- #include <map>
- #include <sstream>
- #include <functional>
- #include <cassert>
- using namespace std;
- template <class T>
- struct heap { // max heap
- vector<T> _data;
- void _sift_up(int i) {
- if (i < 1) return;
- int parent = (i-1)/2;
- if (_data[parent] < _data[i]) {
- swap(_data[parent], _data[i]);
- _sift_up(parent);
- }
- }
- void _sift_down(int i) {
- int l = (i+1)*2-1, r = (i+1)*2;
- int index;
- if (l < _data.size() && r < _data.size()) {
- index = (_data[l] > _data[r]) ? l : r;
- }
- else if (l < _data.size()) index = l;
- else if (r < _data.size()) index = r;
- else {
- return;
- }
- // THIS
- if (_data[i] < _data[index]) {
- swap(_data[i], _data[index]);
- _sift_down(index);
- }
- // THIS ^^^^^^^^^^^^^^^^^^^^
- }
- heap() {
- }
- void extract(){
- if (_data.size() == 0) return;
- if (_data.size() == 1) {
- _data.erase(_data.begin());
- return;
- }
- swap(_data[_data.size()-1], _data[0]);
- _data.erase(_data.begin() + _data.size() -1);
- _sift_down(0);
- }
- T get() {
- return _data[0];
- }
- void insert(const T & obj) {
- _data.push_back(obj);
- _sift_up(_data.size()-1);
- }
- };
- int main() {
- int n;
- cin >> n;
- heap<int> h;
- for(auto i = 0; i < n; i++) {
- string s;
- cin >> s;
- if (s == "Insert") {
- int value;
- cin >> value;
- h.insert(value);
- }
- else {
- cout << h.get() << "\n"; h.extract();
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement