Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. struct Node {
  7. int data;
  8. int index;
  9. };
  10.  
  11. int parent(int i){
  12. return (i - 1) / 2;
  13. }
  14.  
  15. int leftSon(int i){
  16. return 2 * i + 1;
  17. }
  18.  
  19. int rightSon(int i){
  20. return 2 * i + 2;
  21. }
  22.  
  23. void siftDown(Node* &arr, Node* &secondArr, int size, int ind, bool isMin){
  24. int left = leftSon(ind);
  25. int right = rightSon(ind);
  26. int indOfMax = ind;
  27.  
  28. if (right < size && left < size && arr[right].data == arr[left].data &&
  29. (isMin ? arr[right].data < arr[ind].data : arr[right].data > arr[ind].data)){
  30. indOfMax = left;
  31. }
  32. else {
  33. if (left < size &&
  34. (isMin ? arr[left].data < arr[indOfMax].data : arr[left].data > arr[indOfMax].data)) {
  35. indOfMax = left;
  36. }
  37.  
  38. if (right < size &&
  39. (isMin ? arr[right].data < arr[indOfMax].data : arr[right].data > arr[indOfMax].data)) {
  40. indOfMax = right;
  41. }
  42. }
  43.  
  44. if (indOfMax != ind){
  45. swap(secondArr[arr[ind].index].index, secondArr[arr[indOfMax].index].index);
  46. swap(arr[ind], arr[indOfMax]);
  47. siftDown(arr, secondArr, size, indOfMax, isMin);
  48. }
  49. }
  50.  
  51. void siftUp(Node* &arr, Node* &secondArr, int ind, bool isMin){
  52. int i = ind;
  53. while ((isMin ? arr[parent(i)].data > arr[i].data : arr[parent(i)].data < arr[i].data) && i > 0){
  54. swap(secondArr[arr[i].index].index, secondArr[arr[parent(i)].index].index);
  55. swap(arr[i], arr[parent(i)]);
  56. i = parent(i);
  57. }
  58. }
  59.  
  60. int getMin(Node* &arrMin, Node* &arrMax) {
  61. return arrMin[0].data;
  62. }
  63.  
  64. int getMax(Node* &arrMin, Node* &arrMax) {
  65. return arrMax[0].data;
  66. }
  67.  
  68. void insert(Node* &arrMin, Node* &arrMax, int &size, int key) {
  69. Node elem;
  70. elem.data = key;
  71. elem.index = size;
  72. arrMin[size] = elem;
  73. arrMax[size] = elem;
  74.  
  75. ++size;
  76. int tempSize = size - 1;
  77. siftUp(arrMin, arrMax, tempSize, true);
  78. tempSize = size - 1;
  79. siftUp(arrMax, arrMin, tempSize, false);
  80. }
  81.  
  82. int extract(Node* &arr, Node* &secondArr, int size, int indToDelete, bool isMin) {
  83. swap(secondArr[arr[indToDelete].index].index, secondArr[arr[size - 1].index].index);
  84. swap(arr[indToDelete], arr[size - 1]);
  85. int result = arr[size - 1].data;
  86. --size;
  87. if (indToDelete < size){
  88. siftDown(arr, secondArr, size, indToDelete, isMin);
  89. siftUp(arr, secondArr, indToDelete, isMin);
  90. }
  91. return result;
  92. }
  93.  
  94. void clear(Node* &arrMin, Node* &arrMax, int &size)
  95. {
  96. size = 0;
  97. }
  98.  
  99. int main(){
  100. int m;
  101. cin >> m;
  102.  
  103. Node * arrMin = new Node[m];
  104. Node * arrMax = new Node[m];
  105.  
  106. int size = 0;
  107.  
  108. char task[15];
  109.  
  110. for (int i = 0; i < m; ++i) {
  111. cin >> task;
  112. if (strcmp(task, "insert") == 0) {
  113. int key;
  114. cin >> key;
  115. insert(arrMin, arrMax, size, key);
  116. cout << "ok" << endl;
  117. }
  118. else if (strcmp(task, "extract_min") == 0) {
  119. if (size == 0) {
  120. cout << "error" << endl;
  121. }
  122. else {
  123. cout << getMin(arrMin, arrMax) << endl;
  124. extract(arrMin, arrMax, size, 0, true);
  125. extract(arrMax, arrMin, size, arrMin[size - 1].index, false);
  126. size--;
  127. }
  128. }
  129. else if (strcmp(task, "get_min") == 0) {
  130. if (size == 0) {
  131. cout << "error" << endl;
  132. }
  133. else {
  134. cout << getMin(arrMin, arrMax) << endl;
  135. }
  136. }
  137. else if (strcmp(task, "extract_max") == 0) {
  138. if (size == 0) {
  139. cout << "error" << endl;
  140. }
  141. else {
  142. cout << getMax(arrMin, arrMax) << endl;
  143. extract(arrMax, arrMin, size, 0, false);
  144. extract(arrMin, arrMax, size, arrMax[size - 1].index, true);
  145. size--;
  146. }
  147. }
  148. else if (strcmp(task, "get_max") == 0) {
  149. if (size == 0) {
  150. cout << "error" << endl;
  151. }
  152. else {
  153. cout << getMax(arrMin, arrMax) << endl;
  154. }
  155. }
  156. else if (strcmp(task, "size") == 0) {
  157. cout << size << endl;
  158. }
  159. else if (strcmp(task, "clear") == 0) {
  160. clear(arrMin, arrMax, size);
  161. cout << "ok" << endl;
  162. }
  163. }
  164.  
  165. delete[] arrMax;
  166. delete[] arrMin;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement