voiddown(int u) { int t = u; if (u * 2 <= cnt and h[u * 2] < h[t]) t = u * 2; if (u * 2 + 1 <= cnt and h[u * 2 + 1] < h[t]) t = u * 2 + 1; if (u != t) { swap(h[u], h[t]); down(t); } } intmain() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> h[i]; } cnt = n; for (int i = n / 2; i; i--) { down(i); }
constint N = 100010; int n, m; // h数组存的是每个元素 // ph存的是第k个插入的数的对应h数组里的下标 // hp存的是h数组里的某个元素对应ph里面下标 // 例如 a 是第 k 个插入 h数组里的,且在h数组的下标为13,那么h[13] = a, ph[k] = 13,hp[13] = k。 int h[N], ph[N], hp[N], cnt;
voidheap_swap(int a, int b) { // 知道两个元素在h里的下标a,b,交换两个元素 swap(ph[hp[a]], ph[hp[b]]); // hp[a] 为该元素是第x个插入的,ph[hp[a]] 为第x元素插入的h数组的下标, // 交换对应在 hp数组的值 swap(hp[a], hp[b]); // 交换在数组里面的值 swap(h[a], h[b]); } voiddown(int u) { int t = u; if (u * 2 <= cnt and h[u * 2] < h[t]) t = u * 2; if (u * 2 + 1 <= cnt and h[u * 2 + 1] < h[t]) t = u * 2 + 1; if (u != t) { heap_swap(u, t); down(t); } } // up操作是将 子节点与根节点进行交换 voidup(int u) { while (u / 2and h[u / 2] > h[u]) { // 如果父节点大于 子节点,那么就一直是子节点向上,因为是小跟堆 heap_swap(u / 2, u); u /= 2; } } intmain() { cin >> n; int m = 0; while(n--) { string s1; int k,x; cin >> s1; if(s1 == "I") { cin >> x; cnt++; m++; ph[m] = cnt; hp[cnt] = m; h[cnt] = x; up(cnt); } elseif(s1 == "PM") { cout << h[1] << endl; } elseif(s1 == "DM") { heap_swap(1,cnt); cnt--; down(1); } elseif (s1 == "D") { cin >> k; k = ph[k]; heap_swap(k,cnt); cnt--; down(k); up(k); } elseif (s1 == "C") { cin >> k >> x; k = ph[k]; h[k] = x; down(k); up(k); } } return0; }