fork download
  1. // LET ME COOK
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. #define endl '\n'
  5. #define sz(x) (int)x.size()
  6. using namespace std;
  7.  
  8. struct BIT {
  9. vector<int> bit1, bit2;
  10. int n;
  11.  
  12. void init(int _n) {
  13. n = _n;
  14. bit1.assign(n+5, 0);
  15. bit2.assign(n+5, 0);
  16. }
  17.  
  18. void updatePoint(vector<int>& b, int u, int v) {
  19. int idx = u;
  20. while (idx <= n) {
  21. b[idx] += v;
  22. idx += (idx & (-idx));
  23. }
  24. }
  25.  
  26. void updateRange(int l, int r, int v) {
  27. updatePoint(bit1, l, (n - l + 1) * v);
  28. updatePoint(bit1, r + 1, -(n - r) * v);
  29. updatePoint(bit2, l, v);
  30. updatePoint(bit2, r + 1, -v);
  31. }
  32.  
  33. int getsum(vector<int>& b, int u) {
  34. int idx = u, ans = 0;
  35. while (idx > 0) {
  36. ans += b[idx];
  37. idx -= (idx & (-idx));
  38. }
  39. return ans;
  40. }
  41.  
  42. int prefixsum(int u) {
  43. return getsum(bit1, u) - getsum(bit2, u) * (n - u);
  44. }
  45.  
  46. int rangesum(int l, int r) {
  47. return prefixsum(r) - prefixsum(l - 1);
  48. }
  49. };
  50.  
  51. struct query {
  52. int l, r, k, id;
  53. };
  54.  
  55. BIT bit;
  56. const int N = 2e5+5;
  57. const int T = 2e5;
  58. vector<int> have[N];
  59. vector<int> ans(N);
  60. vector<query> q;
  61. int a[N];
  62. int n, que;
  63.  
  64. void bs(int l, int r, vector<query> Q) {
  65. if (l==r || Q.empty()) {
  66. for(auto p : Q) {
  67. ans[p.id] = l;
  68. }
  69. return;
  70. }
  71.  
  72. int mid = l+r>>1;
  73.  
  74. vector<query> QL, QR;
  75.  
  76. if (l <= mid) {
  77. for(int i = l; i <= mid; i++) {
  78. for(int id : have[i]) {
  79. bit.updateRange(id, id, 1);
  80. }
  81. }
  82. }
  83.  
  84.  
  85. for(int i = 0 ; i < sz(Q); i++) {
  86. int tmp = bit.rangesum(Q[i].l, Q[i].r);
  87.  
  88. if (tmp >= Q[i].k) {
  89. QL.push_back(Q[i]);
  90. } else {
  91. Q[i].k -= tmp;
  92. QR.push_back(Q[i]);
  93. }
  94. }
  95.  
  96. if (l <= mid) {
  97. for(int i = l; i <= mid; i++) {
  98. for(int id : have[i]) {
  99. bit.updateRange(id, id, -1);
  100. }
  101. }
  102. }
  103.  
  104. bit.init(n+5);
  105. bs(l, mid, QL);
  106. bs(mid+1, r, QR);
  107. }
  108.  
  109. void Semicolon() {
  110. cin >> n >> que;
  111.  
  112. for(int i = 1; i <= n; i++) {
  113. cin >> a[i];
  114. have[a[i]].push_back(i);
  115. }
  116.  
  117. for(int i = 1; i <= que; i++) {
  118. int l, r; cin >> l >> r;
  119. int len = r-l+1;
  120. int check = (len+1)/2;
  121. q.push_back({l, r, check, i});
  122. }
  123.  
  124. bit.init(n+5);
  125. bs(1, T, q);
  126.  
  127. for(int i = 1; i <= que; i++) {
  128. cout << ans[i] << endl;
  129. }
  130. }
  131.  
  132. signed main() {
  133. ios_base::sync_with_stdio(0); cin.tie(0);
  134. //freopen("", "r", stdin);
  135. //freopen("", "w", stdout);
  136. //freopen("input.txt", "r", stdin);
  137. Semicolon();
  138.  
  139. return 0;
  140. }
Success #stdin #stdout 0.01s 9304KB
stdin
Standard input is empty
stdout
Standard output is empty