Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*input
- 7 3
- 1 5 2 6 3 7 4
- 2 5 3
- 4 4 1
- 1 7 3
- 7 3
- 1 5 2 6 3 7 4
- 2 5 3
- 4 4 1
- 1 7 3
- */
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- using namespace std;
- using namespace __gnu_pbds;
- #define REP(i,j,k) for(int i = j ; i < k ; ++i)
- #define RREP(i,j,k) for(int i = j ; i >=k ; --i)
- #define A first
- #define B second
- #define mp make_pair
- #define pb emplace_back
- #define PII pair<int , int>
- #define MEM(i,j) memset(i , j , sizeof i)
- #define ALL(i) i.begin() , i.end()
- #define DBGG(i,j) cout << i << " " << j << endl
- #define DB4(i,j,k,l) cout << i << " " << j << " " << k << " " << l << endl
- #define IOS cin.tie() , cout.sync_with_stdio(0)
- #define endl "\n"
- ///------------------------------------------------------------
- #define MAX 100900
- #define INF 0x3f3f3f3f
- #define mid ((l + r) >> 1)
- int sum[MAX * 20] , ls[MAX * 20] , rs[MAX * 20] , root[MAX * 20] , po = 2;
- int n , m , x[MAX];
- void Copy(int now , int dot){
- sum[now] = sum[dot];
- ls[now] = ls[dot];
- rs[now] = rs[dot];
- }
- int update(int dot , int l , int r , int val){
- int now = po ++;
- Copy(now , dot);
- if(l == val && r == val) return sum[now] ++ , now;
- else {
- if(val <= mid + 0) ls[now] = update(ls[now] , l , mid + 0 , val);
- if(mid + 1 <= val) rs[now] = update(rs[now] , mid + 1 , r , val);
- sum[now] = sum[ls[now]] + sum[rs[now]];
- return now;
- }
- }
- int query(int r1 , int r2 , int l , int r , int k){
- if(l == r) return l;
- else{
- int lsum = sum[ls[r2]] - sum[ls[r1]];
- if(k <= lsum) return query(ls[r1] , ls[r2] , l , mid + 0 , k);
- else return query(rs[r1] , rs[r2] , mid + 1 , r , k - lsum);
- }
- }
- int32_t main(){
- IOS;
- while(cin >> n >> m){
- vector<int> uni;
- REP(i , 1 , n + 1) cin >> x[i];
- REP(i , 1 , n + 1) uni.pb(x[i]);
- sort(ALL(uni));
- uni.resize(unique(ALL(uni)) - uni.begin());
- REP(i , 1 , n + 1) x[i] = lower_bound(ALL(uni) , x[i]) - uni.begin();
- root[0] = 1 , po = 2;
- REP(i , 1 , n + 1){
- root[i] = update(root[i - 1] , 0 , n , x[i]);
- }
- REP(i , 1 , m + 1){
- int l , r , k;
- cin >> l >> r >> k;
- cout << uni[query(root[l - 1] , root[r] , 0 , n , k)] << endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement