image.png

    1. #include <bits/stdc++.h>
    2. #define int long long
    3. using namespace std;
    4. const int N = 1e6+5, INF = 1e9;
    5. int n, tot, rt;
    6. int tr[N][2];
    7. int val[N], dat[N];
    8. int size[N], cnt[N];
    9. int New(int v) {
    10. val[++tot] = v;
    11. dat[tot] = rand();
    12. size[tot] = 1;
    13. cnt[tot] = 1;
    14. return tot;
    15. }
    16. void pushup(int u) {
    17. size[u] = size[tr[u][0]]+size[tr[u][1]]+cnt[u];
    18. }
    19. void build() {
    20. rt = New(-INF);
    21. tr[rt][1] = New(INF);
    22. pushup(rt);
    23. }
    24. void rotate(int &u, int d) {
    25. int t = tr[u][d^1];
    26. tr[u][d^1] = tr[t][d];
    27. tr[t][d] = u;
    28. u = t;
    29. pushup(tr[u][d]);
    30. pushup(u);
    31. }
    32. void insert(int &u, int v) {
    33. if (!u) {
    34. u = New(v);
    35. return ;
    36. }
    37. if (v == val[u]) {
    38. cnt[u]++;
    39. } else {
    40. int d = v<val[u]?0:1;
    41. insert(tr[u][d], v);
    42. if (dat[u] < dat[tr[u][d]])
    43. rotate(u, d^1);
    44. }
    45. pushup(u);
    46. }
    47. void remove(int &u, int v) {
    48. if (!u)
    49. return ;
    50. if (v == val[u]) {
    51. if (cnt[u] > 1) {
    52. cnt[u]--;
    53. pushup(u);
    54. return ;
    55. }
    56. if (tr[u][0] || tr[u][1]) {
    57. if (!tr[u][1] || dat[tr[u][0]]>dat[tr[u][1]]) {
    58. rotate(u, 1);
    59. remove(tr[u][1], v);
    60. } else {
    61. rotate(u, 0);
    62. remove(tr[u][0], v);
    63. }
    64. pushup(u);
    65. } else {
    66. u = 0;
    67. }
    68. return ;
    69. }
    70. if (v < val[u]) {
    71. remove(tr[u][0], v);
    72. } else {
    73. remove(tr[u][1], v);
    74. }
    75. pushup(u);
    76. }
    77. int get_rank(int u, int v) {
    78. if (!u)
    79. return -2;
    80. if (v == val[u]) {
    81. return size[tr[u][0]]+1;
    82. } else if (v < val[u]) {
    83. return get_rank(tr[u][0], v);
    84. } else {
    85. return size[tr[u][0]]+cnt[u]+get_rank(tr[u][1], v);
    86. }
    87. }
    88. int get_val(int u, int rank) {
    89. if (!u)
    90. return INF;
    91. if (rank <= size[tr[u][0]]) {
    92. return get_val(tr[u][0], rank);
    93. } else if (rank <= size[tr[u][0]]+cnt[u]) {
    94. return val[u];
    95. } else {
    96. return get_val(tr[u][1], rank-size[tr[u][0]]-cnt[u]);
    97. }
    98. }
    99. int get_pre(int v) {
    100. int u = rt, pre;
    101. while (u) {
    102. if (val[u] < v) {
    103. pre = val[u];
    104. u = tr[u][1];
    105. } else {
    106. u = tr[u][0];
    107. }
    108. }
    109. return pre;
    110. }
    111. int get_next(int v) {
    112. int u = rt, next;
    113. while (u) {
    114. if (val[u] > v) {
    115. next = val[u];
    116. u = tr[u][0];
    117. } else {
    118. u = tr[u][1];
    119. }
    120. }
    121. return next;
    122. }
    123. signed main() {
    124. build();
    125. cin >> n;
    126. for (int i = 1; i <= n; i++) {
    127. int op, x;
    128. scanf("%lld%lld", &op, &x);
    129. if (op == 1) {
    130. insert(rt, x);
    131. } else if (op == 2) {
    132. remove(rt, x);
    133. } else if (op == 3) {
    134. cout << get_rank(rt, x)-1 << "\n";
    135. } else if (op == 4) {
    136. cout << get_val(rt, x+1) << "\n";
    137. } else if (op == 5) {
    138. cout << get_pre(x) << "\n";
    139. } else if (op == 6) {
    140. cout << get_next(x) << "\n";
    141. }
    142. }
    143. return 0;
    144. }