Advertisement
NHumme

KEK

Nov 7th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <vector>
  6. #include <string>
  7. #include <set>
  8. #include <stack>
  9. #include <queue>
  10. #include <deque>
  11. using namespace std;
  12.  
  13. #define TASK "priorityqueue"
  14.  
  15. vector < pair < int, int > > a(2000000);
  16. vector < int > p(2000000);
  17. int n = 0, pi = 0, x, y;
  18.  
  19. void sift_d(int i) {
  20.     while (2 * i + 1 < n) {
  21.         int l = 2 * i + 1, r = 2 * i + 2;
  22.         int j = l;
  23.         if (r < n && a[r] < a[l]) {
  24.             j = r;
  25.         }
  26.         if (a[i] <= a[j]) {
  27.             break;
  28.         }
  29.         swap(a[i], a[j]);
  30.         swap(p[a[i].second], p[a[j].second]);
  31.         i = j;
  32.     }
  33. }
  34.  
  35. void sift_u(int i) {
  36.     if (a[i] < a[(i - 1) / 2]) {
  37.         swap(a[i], a[(i - 1) / 2]);
  38.         swap(p[a[i].second], p[a[(i - 1) / 2].second]);
  39.         sift_u((i - 1) / 2);
  40.     }
  41. }
  42.  
  43. int ex_min() {
  44.     int min = a[0].first;
  45.     a[0].first = INT_MAX;
  46.     sift_d(0);
  47.     n--;
  48.     return min;
  49. }
  50.  
  51. void push(int i) {
  52.     a[n].first = i;
  53.     a[n].second = pi;
  54.     p[pi] = n;
  55.     n++;
  56.     sift_u(n - 1);
  57. }
  58.  
  59. void decr_key(int k, int nk) {
  60.     a[p[k - 1]].first = nk;
  61.     sift_u(p[k - 1]);
  62. }
  63.  
  64. int main() {
  65.  
  66. #ifdef _DEBUG
  67.     freopen("debug.in", "r", stdin);
  68.     freopen("debug.out", "w", stdout);
  69. #else
  70.     freopen(TASK".in", "r", stdin);
  71.     freopen(TASK".out", "w", stdout);
  72. #endif // _DEBUG
  73.  
  74.     string s;
  75.     while (cin >> s) {
  76.         if (s[0] == 'p') {
  77.             cin >> x;
  78.             push(x);
  79.         }
  80.         if (s[0] == 'd') {
  81.             cin >> x >> y;
  82.             decr_key(x - 1, y);
  83.         }
  84.         if (s[0] == 'e') {
  85.             if (n > 0) {
  86.                 cout << ex_min() << "\n";
  87.             }
  88.             else {
  89.                 cout << "*\n";
  90.             }
  91.         }
  92.         pi++;
  93.     }
  94.  
  95.     cout << "kek" << endl;
  96.  
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement