Advertisement
Alex-Flexer

Untitled

Sep 26th, 2024
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <string>
  4. #include <queue>
  5. #include <map>
  6. #include <bitset>
  7. #include <vector>
  8. #include <set>
  9. #include <cmath>
  10. #include <iomanip>
  11. #include <algorithm>
  12. #include <fstream>
  13. #include <cmath>
  14. #include <unordered_map>
  15. #include <stack>
  16. #include <math.h>
  17. #include <queue>
  18.  
  19. typedef long long ll;
  20. using namespace std;
  21.  
  22. const ll inf = 1e18;
  23.  
  24. struct Segment
  25. {
  26. ll d;
  27. ll l, r;
  28. ll il, ir;
  29. };
  30.  
  31. bool cmp(const Segment& s1, const Segment& s2)
  32. {
  33. if (s1.d == 0 && s2.d == 0)
  34. return s1.il < s2.il;
  35. if (s1.d * s2.d == 0)
  36. return s1.d == 0;
  37. ll a = (s1.d - 1) / 2;
  38. ll b = (s2.d - 1) / 2;
  39. return (a != b ? a < b : s1.il > s2.il);
  40. }
  41.  
  42. vector<Segment> diss;
  43.  
  44. ll n;
  45.  
  46. void add(ll x)
  47. {
  48. sort(diss.begin(), diss.end(), cmp);
  49. if (diss.back().l == -1)
  50. {
  51. Segment& s = diss.back();
  52. s.l = x;
  53. s.il = 1;
  54. --s.d;
  55. cout << 1 << endl;
  56. }
  57. else if (diss.back().r == -1)
  58. {
  59. Segment& s = diss.back();
  60. s.r = x;
  61. s.ir = n;
  62. --s.d;
  63. cout << n << endl;
  64. }
  65. else
  66. {
  67. Segment s = diss.back();
  68. diss.pop_back();
  69.  
  70. ll im = s.il + (s.d - 1) / 2 + 1;
  71. diss.push_back({ (s.d - 1) / 2, s.l, x, s.il, im });
  72. diss.push_back({ s.d / 2, x, s.r, im, s.ir});
  73. cout << diss.back().il << endl;
  74. }
  75.  
  76. }
  77.  
  78. void rem(ll x)
  79. {
  80. ll il = -1, ir = -1;
  81. for (ll i = 0; i < diss.size(); ++i)
  82. {
  83. if (diss[i].l == x)
  84. il = i;
  85. else if (diss[i].r == x)
  86. ir = i;
  87. }
  88.  
  89. if (ir == -1)
  90. {
  91. diss[il].l = -1;
  92. diss[il].il = -1;
  93. ++diss[il].d;
  94. }
  95. else if (il == -1)
  96. {
  97. diss[ir].r = -1;
  98. diss[ir].ir = -1;
  99. ++diss[ir].d;
  100. }
  101. else
  102. {
  103. Segment& r = diss[ir];
  104. Segment& l = diss[il];
  105. r.r = l.r;
  106. r.ir = l.ir;
  107. r.d += l.d + 1;
  108. diss.erase(diss.begin() + il);
  109. }
  110.  
  111. }
  112.  
  113.  
  114. int main()
  115. {
  116. ll k;
  117. cin >> n >> k;
  118. ll cnt = 0;
  119. diss.push_back({ n, -1, -1, -1, -1 });
  120. while (k--)
  121. {
  122. string s;
  123. cin >> s;
  124. if (s == "+")
  125. add(++cnt);
  126. else
  127. rem(-1 * stoi(s));
  128. }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement