推荐博客:
https://blog.csdn.net/pengwill97/article/details/80920143
https://www.cnblogs.com/AKMer/p/9956734.html
模板:求区间静态第k大
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=2e5+10;
4 struct node{
5 int l,r,num;
6 }tree[maxn*100];
7 int size=0,a[maxn],refl[maxn],root[maxn];
8 void update(int &x,int y,int l,int r,int dex){
9 x=++size;
10 tree[x]=tree[y]; tree[x].num++;
11 if(l==r) return ;
12 int mid=(l+r)>>1;
13 if (dex<=mid) update(tree[x].l,tree[y].l,l,mid,dex);
14 else update(tree[x].r,tree[y].r,mid+1,r,dex);
15 }
16 int query(int x,int y,int l,int r,int kk){
17 if (l==r) return l;
18 int mid=(l+r)>>1;
19 int tmp=tree[tree[y].l].num-tree[tree[x].l].num;
20 if (tmp>=kk) return query(tree[x].l,tree[y].l,l,mid,kk);
21 else return query(tree[x].r,tree[y].r,mid+1,r,kk-tmp);
22 }
23 int main(){
24 int n,m,l,r,k;scanf("%d%d",&n,&m);
25 for (int i=1;i<=n;i++){
26 scanf("%d",&a[i]);
27 refl[i]=a[i];
28 }
29 sort(refl+1,refl+1+n);
30 int tot=unique(refl+1,refl+1+n)-(refl+1);
31 for (int i=1;i<=n;i++){
32 a[i]=lower_bound(refl+1,refl+1+tot,a[i])-refl;
33 update(root[i],root[i-1],1,tot,a[i]);
34 }
35 while (m--){
36 scanf("%d%d%d",&l,&r,&k);
37 int tmp=query(root[l-1],root[r],1,tot,k);
38 printf("%d\n",refl[tmp]);
39 }
40 return 0;
41 }