Advertisement
boook

Untitled

Oct 25th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. /*input
  2. 7 3
  3. 1 5 2 6 3 7 4
  4. 2 5 3
  5. 4 4 1
  6. 1 7 3
  7. 7 3
  8. 1 5 2 6 3 7 4
  9. 2 5 3
  10. 4 4 1
  11. 1 7 3
  12. */
  13. #include <bits/stdc++.h>
  14. #include <ext/pb_ds/assoc_container.hpp>
  15. using namespace std;
  16. using namespace __gnu_pbds;
  17. #define REP(i,j,k) for(int i = j ; i < k ; ++i)
  18. #define RREP(i,j,k) for(int i = j ; i >=k ; --i)
  19. #define A first
  20. #define B second
  21. #define mp make_pair
  22. #define pb emplace_back
  23. #define PII pair<int , int>
  24. #define MEM(i,j) memset(i , j , sizeof i)
  25. #define ALL(i) i.begin() , i.end()
  26. #define DBGG(i,j) cout << i << " " << j << endl
  27. #define DB4(i,j,k,l) cout << i << " " << j << " " << k << " " << l << endl
  28. #define IOS cin.tie() , cout.sync_with_stdio(0)
  29. #define endl "\n"
  30. ///------------------------------------------------------------
  31. #define MAX 100900
  32. #define INF 0x3f3f3f3f
  33. #define mid ((l + r) >> 1)
  34.  
  35. int sum[MAX * 20] , ls[MAX * 20] , rs[MAX * 20] , root[MAX * 20] , po = 2;
  36. int n , m , x[MAX];
  37. void Copy(int now , int dot){
  38. sum[now] = sum[dot];
  39. ls[now] = ls[dot];
  40. rs[now] = rs[dot];
  41. }
  42. int update(int dot , int l , int r , int val){
  43. int now = po ++;
  44. Copy(now , dot);
  45. if(l == val && r == val) return sum[now] ++ , now;
  46. else {
  47. if(val <= mid + 0) ls[now] = update(ls[now] , l , mid + 0 , val);
  48. if(mid + 1 <= val) rs[now] = update(rs[now] , mid + 1 , r , val);
  49. sum[now] = sum[ls[now]] + sum[rs[now]];
  50. return now;
  51. }
  52. }
  53. int query(int r1 , int r2 , int l , int r , int k){
  54. if(l == r) return l;
  55. else{
  56. int lsum = sum[ls[r2]] - sum[ls[r1]];
  57. if(k <= lsum) return query(ls[r1] , ls[r2] , l , mid + 0 , k);
  58. else return query(rs[r1] , rs[r2] , mid + 1 , r , k - lsum);
  59. }
  60. }
  61. int32_t main(){
  62. IOS;
  63. while(cin >> n >> m){
  64. vector<int> uni;
  65. REP(i , 1 , n + 1) cin >> x[i];
  66. REP(i , 1 , n + 1) uni.pb(x[i]);
  67. sort(ALL(uni));
  68. uni.resize(unique(ALL(uni)) - uni.begin());
  69. REP(i , 1 , n + 1) x[i] = lower_bound(ALL(uni) , x[i]) - uni.begin();
  70. root[0] = 1 , po = 2;
  71. REP(i , 1 , n + 1){
  72. root[i] = update(root[i - 1] , 0 , n , x[i]);
  73. }
  74. REP(i , 1 , m + 1){
  75. int l , r , k;
  76. cin >> l >> r >> k;
  77. cout << uni[query(root[l - 1] , root[r] , 0 , n , k)] << endl;
  78. }
  79. }
  80. return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement