fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. using ll = long long;
  5.  
  6. const int N = 2e5+5;
  7. const int NODES = 22*N;
  8.  
  9. int n, q, a[N];
  10. int roots[N], nodes = 0;
  11. int lc[NODES], rc[NODES], cnt[NODES];
  12. vector<int> vals;
  13.  
  14. int update(int p, int l, int r, int k) {
  15. int id = ++nodes;
  16. lc[id] = lc[p]; rc[id] = rc[p];
  17. cnt[id] = cnt[p] + 1;
  18. if (l == r) return id;
  19. int mid = (l + r) >> 1;
  20. if (k <= mid) lc[id] = update(lc[p], l, mid, k);
  21. else rc[id] = update(rc[p], mid + 1, r, k);
  22. return id;
  23. }
  24.  
  25. int query(int L, int R, int l, int r, int x) {
  26. if (l == r) return l;
  27. int cntL = cnt[lc[R]] - cnt[lc[L]];
  28. int mid = (l + r) >> 1;
  29. if (x <= cntL) return query(lc[L], lc[R], l, mid, x);
  30. return query(rc[L], rc[R], mid + 1, r, x - cntL);
  31. }
  32.  
  33. void solve() {
  34. cin >> n >> q;
  35. for (int i = 1; i <= n; i++) {
  36. cin >> a[i];
  37. vals.push_back(a[i]);
  38. }
  39. sort(vals.begin(), vals.end());
  40. vals.erase(unique(vals.begin(), vals.end()), vals.end());
  41. int m = vals.size();
  42. roots[0] = 0;
  43. for (int i = 1; i <= n; i++) {
  44. a[i] = lower_bound(vals.begin(), vals.end(), a[i]) - vals.begin() + 1;
  45. roots[i] = update(roots[i - 1], 1, m, a[i]);
  46. }
  47. while (q--) {
  48. int l, r, k; cin >> l >> r >> k;
  49. int p = query(roots[l - 1], roots[r], 1, m, k);
  50. cout << vals[p - 1] << '\n';
  51. }
  52. }
  53.  
  54. int main() {
  55. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  56.  
  57. int tests = 1; // cin >> tests;
  58. while (tests--) solve();
  59.  
  60. #ifdef LOCAL
  61. cerr << "\nTime elapsed: " << clock() << " ms.\n";
  62. #endif
  63. return 0;
  64. }
Success #stdin #stdout 0s 5652KB
stdin
7 3
1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3
stdout
5
6
3