#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define mid (l+r>>1)
#define lson (o<<1)
#define rson (o<<1|1)
using namespace std;
const int N = 1e5+100;
struct node{
int x,pos;
bool operator < (node b)const{
return x<b.x;
}
}s[N];
struct TREE{
int l,r,x;
}tree[N*20];
int rk[N],tot,rt[N];
void insert(int &o,int l,int r,int data){
tree[++tot] = tree[o];
o = tot;
tree[o].x++;
if(l==r) return ;
if(mid>=data) insert(tree[o].l,l,mid,data);
else insert(tree[o].r,mid+1,r,data);
}
int query(int lo,int ro,int l,int r,int data){
if(l==r) return l;
int k = tree[tree[ro].l].x-tree[tree[lo].l].x;
if(k>=data) return query(tree[lo].l,tree[ro].l,l,mid,data);
else return query(tree[lo].r,tree[ro].r,mid+1,r,data-k);
}
int main(){
//freopen("a.txt","r",stdin);
ios::sync_with_stdio(0);
int n,m,i;
cin>>n>>m;
for(i = 1;i <= n;i ++){
cin>>s[i].x;
s[i].pos = i;
}
sort(s+1,s+n+1);
for(i = 1;i <= n;i ++) rk[s[i].pos] = i;
rt[0] = 0;
tree[0].l = tree[0].r = tree[0].x = 0;
for(i = 1;i <= n;i ++){
rt[i] = rt[i-1];
insert(rt[i],1,n,rk[i]);
}
for(i = 1;i <= m;i ++){
int l,r,k;
cin>>l>>r>>k;
cout<<s[query(rt[l-1],rt[r],1,n,k)].x<<endl;
}
return 0;
}
主席树无修改查询区间第k小
最新推荐文章于 2021-02-09 14:33:25 发布