1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <iostream> #include <algorithm>
using namespace std;
const int N = 100010;
char op[4]; int n, k, x, cnt, h[N], ph[N], hp[N], m;
void heap_swap(int a, int b) { swap(ph[hp[a]], ph[hp[b]]); swap(hp[a], hp[b]); swap(h[a], h[b]); }
void up(int u) { while (u / 2 && h[u / 2] > h[u]) { heap_swap(u / 2, u); u /= 2; } }
void down(int u) { int t = u; if (u * 2 <= cnt && h[u * 2] < h[t]) t = u * 2; if (u * 2 + 1 <= cnt && h[u * 2 + 1] < h[t]) t = u * 2 + 1; if (u != t) { heap_swap(t, u); down(t); } }
int main() { cin >> n; while (n -- ) { scanf("%s", op); if (op[0] == 'I') { scanf("%d", &x); cnt ++ , m ++ ; h[cnt] = x, hp[cnt] = m, ph[m] = cnt; up(cnt); } else if (op[0] == 'P') printf("%d\n", h[1]); else if (op[0] == 'C') { scanf("%d%d", &k, &x); k = ph[k]; h[k] = x; up(k), down(k); } else if (op[1] == 'M') { heap_swap(1, cnt); cnt -- ; down(1); } else { scanf("%d", &k); k = ph[k]; heap_swap(k, cnt); cnt -- ; up(k), down(k); } }
return 0; }
|