#include <bits/stdc++.h> #define ld(p) t[p].lh #define rd(p) t[p].rh using namespace std; const int N = 2e5 + 5, MX = 25 * N; int n, m, a[N], tmp[N], cnt, tot, rt[N]; struct Node{int lh, rh, sum;} t[MX]; void build(int &p, int l, int r){ p = ++tot, t[p].sum = 0; if(l == r) return; int mid = l + r >> 1; build(ld(p), l, mid), build(rd(p), mid + 1, r); } void upd(int lp, int &p, int l, int r, int pos){ p = ++tot, t[p] = (Node) {ld(lp), rd(lp), t[lp].sum + 1}; if(l == r) return; int mid = (l + r) >> 1; if(pos <= mid) upd(ld(lp), ld(p), l, mid, pos); else upd(rd(lp), rd(p), mid + 1, r, pos); } int ask(int lp, int p, int l, int r, int k){ if(l == r) return l; //sl应该是左子树的个数,而不是当前树的个数 int mid = (l + r) >> 1, sl = t[ld(p)].sum - t[ld(lp)].sum; if(k <= sl) return ask(ld(lp), ld(p), l, mid, k); else return ask(rd(lp), rd(p), mid + 1, r, k - sl);//记得减sl } int main(){ ios::sync_with_stdio(0);cin.tie(0); cin >> n >> m; for(int i = 1;i <= n;i++) cin >> a[i], tmp[i] = a[i]; sort(tmp + 1, tmp + n + 1), cnt = unique(tmp + 1, tmp + n + 1) - tmp - 1; build(rt[0], 1, cnt); for(int i = 1;i <= n;i++){ int sz = lower_bound(tmp + 1, tmp + cnt + 1, a[i]) - tmp; upd(rt[i - 1], rt[i], 1, cnt, sz); } for(int i = 1;i <= m;i++){ int l, r, k; cin >> l >> r >> k, cout << tmp[ask(rt[l - 1], rt[r], 1, cnt, k)] << "\n"; } return 0; }
Note.ms
/kcjhxds