fork(2) download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const long max_size = 100000;
  6. long long heap[max_size];
  7. long h_size = 0; // Текущий размер кучи
  8.  
  9. void sift_down(long i, bool f = true) { // f - нужно ли выводить конечную позицию элемента или нет
  10. while (i * 2 + 1 < h_size) {
  11. long j = i * 2 + 1;
  12. if (j + 1 < h_size && heap[j + 1] > heap[j]) ++j;
  13. if (heap[i] < heap[j]) swap(heap[i], heap[j]);
  14. else break;
  15. i = j;
  16. }
  17. if (f) cout << i + 1 << " "; // Вывод конечной позиции элемента
  18. }
  19.  
  20. void sift_up(long i, bool f = true) { // f - нужно ли выводить конечную позицию элемента или нет
  21. while (heap[i] > heap[(i - 1) / 2]) {
  22. swap(heap[i], heap[(i - 1) / 2]);
  23. i = (i - 1) / 2;
  24. }
  25. if (f) cout << i + 1 << endl; // Вывод конечной позиции элемента
  26. }
  27.  
  28. int main() {
  29. ios_base::sync_with_stdio(false);
  30. long n, m;
  31. cin >> n >> m; // n максимальный размер кучи, m количество заросов
  32. for (long i = 0; i < m; i++) {
  33. long a;
  34. cin >> a; // Тип запроса, 1, 2 или 3
  35. if (a == 1) { // Тут все правильно
  36. if (!h_size) cout << -1 << "\n";
  37. else {
  38. long x = heap[0];
  39. heap[0] = heap[--h_size];
  40. if (!h_size) cout << "0 ";
  41. else sift_down(0);
  42. cout << x << "\n";
  43. }
  44. }
  45. if (a == 2) { // Тут все правильно
  46. long long b;
  47. cin >> b;
  48. if (h_size == n) cout << "-1\n";
  49. else {
  50. heap[h_size++] = b;
  51. sift_up(h_size - 1);
  52. }
  53. }
  54. if (a == 3) { // Вот тут по идее проблемы
  55. long b; // Индекс удаляемого элемента
  56. cin >> b;
  57. if (h_size < b) cout << "-1\n";
  58. else {
  59. long long x = heap[--b];
  60. cout << x << "\n"; // Выводим сам элемент
  61. heap[b] = heap[--h_size]; // Ставим на его место последний
  62. sift_up(b, false); // По условию выводить конечную позицию элемента
  63. sift_down(b, false); // не нужно когда запрос типа 3, потому false
  64. }
  65. }
  66. }
  67. for (long i = 0; i < h_size; i++) cout << heap[i] << " "; // Вывод кучи
  68. }
  69.  
Success #stdin #stdout 0s 4240KB
stdin
4 10
1
2 9
2 4
2 9
2 9
2 7
1
3 4
2 1
3 3
stdout
-1
1
2
3
2
-1
2 9
-1
4
9
9 4 1