gt22

Untitled

Jun 30th, 2021
783
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <vector>
  2. #include "optimization.h"
  3. #include <cassert>
  4. using namespace std;
  5. vector<int> heapMin, heapMax;
  6. vector<int> values, posMin, posMax;
  7.  
  8. void swap_min(int i, int j) {
  9.     swap(posMin[heapMin[i]], posMin[heapMin[j]]);
  10.     swap(heapMin[i], heapMin[j]);
  11. }
  12.  
  13. void swap_max(int i, int j) {
  14.     swap(posMax[heapMax[i]], posMax[heapMax[j]]);
  15.     swap(heapMax[i], heapMax[j]);
  16. }
  17.  
  18. void siftUp_min(int i) {
  19.     while(i > 0) {
  20.         int parent = i % 2 == 0 ? (i - 2) / 2 : (i - 1) / 2;
  21.         if (values[heapMin[parent]] > values[heapMin[i]]) {
  22.             swap_min(i, parent);
  23.         } else {
  24.             break;
  25.         }
  26.         i = parent;
  27.     }
  28. }
  29.  
  30. void siftDown_min(int i) {
  31.     while(i < heapMin.size()) {
  32.         int l = 2 * i + 1, r = 2 * i + 2;
  33.         int minChild = r < heapMin.size() ? (values[heapMin[l]] < values[heapMin[r]] ? l : r) : (l < heapMin.size() ? l : -1);
  34.         if(minChild == -1) break;
  35.         if (values[heapMin[i]] > values[heapMin[minChild]]) {
  36.             swap_min(i, minChild);
  37.         }
  38.         i = minChild;
  39.     }
  40. }
  41.  
  42. void siftUp_max(int i) {
  43.     while(i > 0) {
  44.         int parent = i % 2 == 0 ? (i - 2) / 2 : (i - 1) / 2;
  45.         if (values[heapMax[parent]] < values[heapMax[i]]) {
  46.             swap_max(i, parent);
  47.         } else {
  48.             break;
  49.         }
  50.         i = parent;
  51.     }
  52. }
  53.  
  54. void siftDown_max(int i) {
  55.     while(i < heapMax.size()) {
  56.         int l = 2 * i + 1, r = 2 * i + 2;
  57.         int maxChild = r < heapMax.size() ? (values[heapMax[l]] > values[heapMax[r]] ? l : r) : (l < heapMax.size() ? l : -1);
  58.         if(maxChild == -1) return;
  59.         if (values[heapMax[i]] < values[heapMax[maxChild]]) {
  60.             swap_max(i, maxChild);
  61.         }
  62.         i = maxChild;
  63.     }
  64. }
  65.  
  66. void add(int elem) {
  67.     int iv = values.size();
  68.     int ih = heapMin.size();
  69.    
  70.     values.push_back(elem);
  71.    
  72.     posMin.push_back(ih);
  73.     heapMin.push_back(iv);
  74.     siftUp_min(ih);
  75.    
  76.     posMax.push_back(ih);
  77.     heapMax.push_back(iv);
  78.     siftUp_max(ih);
  79. }
  80.  
  81. int min() {
  82.     return heapMin[0];
  83. }
  84.  
  85. int max() {
  86.     return heapMax[0];
  87. }
  88.  
  89. void delFromMin(int elem) {
  90.     int helem = posMin[elem];
  91.     int he = heapMin.size() - 1;
  92.     swap_min(helem, he);
  93.     heapMin.pop_back();
  94. //    siftDown_min(helem);
  95.     siftUp_min(helem);
  96. }
  97.  
  98. void delFromMax(int elem) {
  99.     int helem = posMax[elem];
  100.     int he = heapMax.size() - 1;
  101.     swap_max(helem, he);
  102.     heapMax.pop_back();
  103. //    siftDown_max(helem);
  104.     siftUp_max(helem);
  105. }
  106.  
  107. int delmin() {
  108.     int m = min();
  109.     int i = heapMin.size() - 1;
  110.     swap_min(0, i);
  111.     heapMin.pop_back();
  112.     siftDown_min(0);
  113.     delFromMax(m);
  114.     return values[m];
  115. }
  116.  
  117. int delmax() {
  118.     int m = max();
  119.     int i = heapMin.size() - 1;
  120.     swap_max(0, i);
  121.     heapMax.pop_back();
  122.     siftDown_max(0);
  123.     delFromMin(m);
  124.     return values[m];
  125. }
  126.  
  127. int main() {
  128.     int n = readInt();
  129.     for (int i = 0; i < n; i++) {
  130.         if(readChar() == 'I') {
  131.             while(readChar() != '(');
  132.             add(readInt()); //readInt also captures )
  133.             assert(getChar() == '\n');
  134.         } else {
  135.             while(readChar() != 'M');
  136.             if(readChar() == 'i') {
  137.                 assert(readChar() == 'n');
  138.                 assert(getChar() == '\n');
  139.                 writeInt(delmin(), '\n');
  140.             } else {
  141.                 assert(readChar() == 'x');
  142.                 assert(getChar() == '\n');
  143.                 writeInt(delmax(), '\n');
  144.             }
  145.         }
  146.     }
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment