Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define rep(i, a, b) for(int i = (a); i <= (b); ++i)
- #define per(i, a, b) for(int i = (a); i >= (b); --i)
- #define debug(x) cerr << #x << ' ' << x << endl;
- using namespace std;
- typedef long long ll;
- const int MAXN = 2e5 + 7;
- vector<int> v;
- int a[MAXN];
- int get_id(int x){
- return lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
- }
- struct PST{
- int roots[MAXN], cnt;
- struct node{
- int ls, rs, val;
- }s[MAXN * 30];
- void upd(int l, int r, int &newrt, int rt, int v){
- s[++cnt] = s[rt]; s[cnt].val++; newrt = cnt;
- if(l == r) return;
- int mid = (l+r)>>1;
- if(v <= mid) upd(l, mid, s[newrt].ls, s[rt].ls, v);
- else upd(mid+1, r, s[newrt].rs, s[rt].rs, v);
- }
- int get(int l, int r, int newrt, int oldrt, int k){
- if(l == r) return v[l-1];
- int sum = s[s[newrt].ls].val - s[s[oldrt].ls].val;
- int mid = (l+r)>>1;
- if(sum >= k) return get(l, mid, s[newrt].ls, s[oldrt].ls, k);
- else return get(mid+1, r, s[newrt].rs, s[oldrt].rs, k - sum);
- }
- }pst;
- int main() {
- int T;
- scanf("%d", &T);
- while(T--){
- int n, m;
- scanf("%d %d", &n, &m);
- rep(i, 1, n){
- scanf("%d", &a[i]);
- v.push_back(a[i]);
- }
- sort(v.begin(), v.end());
- v.erase(unique(v.begin(), v.end()), v.end());
- int len = v.size();
- pst.cnt = 0; pst.roots[0] = 0;
- rep(i, 1, n) pst.upd(1, len, pst.roots[i], pst.roots[i-1], get_id(a[i]));
- int l, r, k;
- rep(i, 1, m){
- scanf("%d %d %d", &l, &r, &k);
- if(l > r) swap(l, r);
- printf("%d\n", pst.get(1, len, pst.roots[r], pst.roots[l-1], k));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement