传送门
题解:
主席树,询问的时候暴力向左儿子走,单次复杂度 O ( k log n ) O(k\log n) O(klogn)。
没了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define gc get_char
#define cs const
namespace IO{
inline char get_char(){
static cs int Rlen=1<<22|1;
static char buf[Rlen],*p1,*p2;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;
}
template<typename T>
inline T get(){
char c;T num;
while(!isdigit(c=gc()));num=c^48;
while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);
return num;
}
inline int gi(){return get<int>();}
}
using namespace IO;
using std::cerr;
using std::cout;
cs int N=3e5+7;
namespace PST{
cs int N=::N*30;
int lc[N],rc[N],siz[N],now;
inline void ins(int &rt,int l,int r,int p){
++now;siz[now]=siz[rt]+1;
lc[now]=lc[rt],rc[now]=rc[rt];rt=now;
if(l==r)return ;
int mid=l+r>>1;
(p<=mid)?ins(lc[rt],l,mid,p):ins(rc[rt],mid+1,r,p);
}
inline int query(int lt,int rt,int l,int r,int need){
if(need>siz[rt]-siz[lt])return -1;
if(l==r)return l;int mid=l+r>>1;
int res=query(lc[lt],lc[rt],l,mid,need);
if(~res)return res;
return query(rc[lt],rc[rt],mid+1,r,need);
}
}
int rt[N];
int a[N],b[N],n,m,cnt;
signed main(){
#ifdef zxyoi
freopen("destiny.in","r",stdin);
#endif
n=gi(),m=gi();
for(int re i=1;i<=n;++i)a[i]=b[i]=gi();
std::sort(b+1,b+n+1);
cnt=std::unique(b+1,b+n+1)-b-1;
std::swap(cnt,n);
for(int re i=1;i<=cnt;++i){
rt[i]=rt[i-1];PST::ins(rt[i],1,n,std::lower_bound(b+1,b+n+1,a[i])-b);
}
while(m--){
int l=gi(),r=gi(),k=gi();
k=(r-l+1)/k+1;
k=PST::query(rt[l-1],rt[r],1,n,k);
if(~k)k=b[k];
cout<<k<<"\n";
}
return 0;
}