fork download
  1. /*
  2.   author : [ Godsent ]
  3.   created : 2025.08.16 15:39:24
  4. */
  5.  
  6. #include <bits/stdc++.h>
  7. #include <ext/pb_ds/assoc_container.hpp>
  8. #include <ext/pb_ds/tree_policy.hpp>
  9. #define el "\n"
  10. #define int long long
  11. #define lb lower_bound
  12. #define ub upper_bound
  13. #define fi first
  14. #define se second
  15. #define sz(x) ((int)(x).size())
  16. #define all(v) (v).begin(), (v).end()
  17. #define pb push_back
  18. #define prs(n) fixed << setprecision(n)
  19.  
  20. const int mod = 1e9 + 7;
  21. const int N = 1e5 + 5;
  22. const int INF = 1e18;
  23.  
  24. using namespace std;
  25. using namespace __gnu_pbds;
  26. template <typename T>
  27. using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  28.  
  29. int n, q;
  30. int a[N], bit[N], res[N];
  31. pair<int,int> b[N];
  32.  
  33. void update(int i) {
  34. while(i <= n) {
  35. bit[i] += 1;
  36. i += i & -i;
  37. }
  38. }
  39.  
  40. int get(int i) {
  41. int res = 0;
  42. while(i > 0) {
  43. res += bit[i];
  44. i -= i & -i;
  45. }
  46. return res;
  47. }
  48.  
  49. signed main() {
  50. ios_base::sync_with_stdio(false);
  51. cin.tie(0);
  52. cout.tie(0);
  53.  
  54. #ifndef ONLINE_JUDGE
  55. freopen("test.in", "r", stdin);
  56. freopen("test.out", "w", stdout);
  57. #endif
  58.  
  59. cin >> n >> q;
  60. int l = INT_MAX, r = INT_MIN;
  61. for (int i = 1; i <= n; i++) {
  62. cin >> a[i];
  63. l = min(l, a[i]);
  64. r = max(r, a[i]);
  65. b[i] = {a[i], i};
  66. }
  67.  
  68. sort(b + 1, b + 1 + n);
  69.  
  70. vector<vector<int>> bucket(q, vector<int>(7));
  71. for (int i = 0; i < q; i++) {
  72. int u, v, k;
  73. cin >> u >> v >> k;
  74. bucket[i][1] = l;
  75. bucket[i][2] = r;
  76. bucket[i][3] = u;
  77. bucket[i][4] = v;
  78. bucket[i][5] = k;
  79. bucket[i][6] = i + 1;
  80. }
  81.  
  82. bool done = false;
  83. while(!done) {
  84. done = true;
  85.  
  86. for (int i = 0; i < q; i++) {
  87. if (bucket[i][1] <= bucket[i][2]) {
  88. done = false;
  89. int mid = (bucket[i][1] + bucket[i][2]) >> 1;
  90. bucket[i][0] = mid;
  91. }
  92. }
  93.  
  94. if (done) break;
  95.  
  96. sort(all(bucket));
  97.  
  98. int idx = 1;
  99. for (int i = 0; i < q; i++) {
  100. if (bucket[i][1] > bucket[i][2]) continue;
  101. while(idx <= n && bucket[i][0] >= b[idx].fi) {
  102. update(b[idx].se);
  103. idx++;
  104. }
  105. int s = get(bucket[i][4]) - get(bucket[i][3] - 1);
  106. if (s >= bucket[i][5]) {
  107. res[bucket[i][6]] = bucket[i][0];
  108. bucket[i][2] = bucket[i][0] - 1;
  109. }
  110. else bucket[i][1] = bucket[i][0] + 1;
  111. }
  112. fill(bit + 1, bit + 1 + n, 0);
  113. }
  114.  
  115. for (int i = 1; i <= q; i++) cout << res[i] << el;
  116.  
  117. return 0;
  118. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Standard output is empty