Advertisement
Guest User

Untitled

a guest
Apr 26th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. /*
  2. Persistent Segment Tree Basic Code
  3. Memory: O(N+QlogN)
  4. Point Update, Range Query
  5.  
  6. solves SPOJ MKTHNUM
  7. given a query (i,j,k)
  8. find the kth element in the sorted subarray [i,j]
  9. */
  10.  
  11. #include<bits/stdc++.h>
  12. using namespace std;
  13. const int MAXX = 100000;
  14.  
  15. struct Node {
  16. int cnt;
  17. Node *bam, *dan;
  18. Node(int c = 0, Node *b = NULL, Node *d = NULL) : cnt(c), bam(b), dan(d) {}
  19.  
  20. void build(int l, int r) {
  21. if (l==r) return;
  22. int mid = (l+r)/2;
  23. bam = new Node();
  24. dan = new Node();
  25. bam->build(l, mid);
  26. dan->build(mid+1, r);
  27. }
  28.  
  29. Node* update(int l, int r, int idx, int v) {
  30. if (idx < l || r < idx) return this;
  31. if (l==r) {
  32. Node *ret = new Node(cnt);
  33. ret->cnt += v;
  34. return ret;
  35. }
  36.  
  37. Node* ret = new Node();
  38. int mid = (l+r)/2;
  39. ret->bam = bam->update(l, mid, idx, v);
  40. ret->dan = dan->update(mid+1, r, idx, v);
  41. ret->cnt = ret->bam->cnt + ret->dan->cnt;
  42. return ret;
  43. }
  44. }* root[MAXX+7];
  45.  
  46. int getKth(Node* R, Node* L, int l, int r, int k) {
  47. assert(R->cnt+L->cnt >= k);
  48. if (l==r) {
  49. return l;
  50. }
  51. int bk = R->bam->cnt-L->bam->cnt;
  52. int mid = (l+r)/2;
  53. if (k <= bk) return getKth(R->bam, L->bam, l, mid, k);
  54. else return getKth(R->dan, L->dan, mid+1, r, k-bk);
  55. }
  56.  
  57. int main()
  58. {
  59. ios_base::sync_with_stdio(false);
  60. cin.tie(0);
  61.  
  62. int n, m;
  63. cin >> n >> m;
  64.  
  65. vector<int>v(n), s(n);
  66. for (int i = 0; i < n; i++) {
  67. cin >> v[i];
  68. s[i] = v[i];
  69. }
  70.  
  71. sort(s.begin(), s.end());
  72. map<int, int>mp;
  73. for (int i = 0; i < n; i++) mp[s[i]] = i;
  74.  
  75. root[0] = new Node();
  76. root[0]->build(0, MAXX-1);
  77.  
  78. for (int i = 1; i <= n; i++) {
  79. root[i] = root[i-1]->update(0, MAXX-1, mp[v[i-1]], 1);
  80. }
  81.  
  82. while (m--) {
  83. int i, j, k;
  84. cin >> i >> j >> k;
  85. assert(1 <= k && k <= j-i+1);
  86. int x = getKth(root[j], root[i-1], 0, MAXX-1, k);
  87. cout << s[x] << '\n';
  88. }
  89.  
  90.  
  91. return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement