image.png

    1. #include <iostream>
    2. #include <stdio.h>
    3. using namespace std;
    4. const int N =100010;
    5. int a[N], b[N],hi[N],num,idx;
    6. //b[idx]记录第idx个元素的序号
    7. //hi[]存储idx,当前元素是第几个元素,hi[序号]=idx(第几个元素)
    8. void hswap(int t, int u){
    9. swap(b[hi[t]], b[hi[u]]);//交换当前序号
    10. swap(hi[t], hi[u]);//交换k的值
    11. swap(a[t],a[u]);
    12. }
    13. void up(int u){
    14. while(u / 2 && a[u] < a[u / 2]){
    15. hswap(u, u/2);
    16. u = u / 2;
    17. }
    18. }
    19. void down(int u){
    20. int t = u;
    21. if(u * 2 <= num && a[t] > a[u * 2]) t = u * 2;
    22. if(u * 2 + 1 <= num && a[t] > a[u * 2 + 1]) t = u * 2 + 1;
    23. if(u != t){
    24. hswap(t , u);
    25. down(t);
    26. }
    27. }
    28. int main(){
    29. int n,x,k;
    30. // idx=0;
    31. cin >> n;
    32. while(n--){
    33. char op[5];
    34. cin >> op;
    35. if(op[0] == 'I'){
    36. cin >> x;
    37. idx++;
    38. num++;
    39. b[idx] = num;
    40. hi[num] = idx;
    41. a[num] = x;
    42. up(num);
    43. }else if(op[0] == 'P'){
    44. cout << a[1] << endl;
    45. }else if(op[1] == 'M'){
    46. hswap(1, num);//不只是交换数值,还交换了下标和序号等信息
    47. num--;
    48. down(1);
    49. }else if(op[0] == 'D'){
    50. cin >> k;
    51. k = b[k];//k是临时变量,不会因为b[]的变化而变化
    52. hswap(k, num);
    53. num--;
    54. up(k);
    55. down(k);
    56. }else if(op[0] == 'C'){
    57. cin >> k >> x;
    58. k = b[k];//k是临时变量,不会因为b[]的变化而变化
    59. a[k] = x;
    60. up(k);
    61. down(k);
    62. }
    63. }
    64. return 0;
    65. }