题解
话说……这完全就是个板子吧啊喂……
不过更好奇的是为什么我第一次交竟然会WA???
不知道主席树是什么的可以看看这篇文章
1 //minamoto 2 #include<bits/stdc++.h> 3 #define N 100005 4 using namespace std; 5 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 6 char buf[1<<21],*p1=buf,*p2=buf; 7 inline int read(){ 8 #define num ch-'0' 9 char ch;bool flag=0;int res; 10 while(!isdigit(ch=getc())) 11 (ch=='-')&&(flag=true); 12 for(res=num;isdigit(ch=getc());res=res*10+num); 13 (flag)&&(res=-res); 14 #undef num 15 return res; 16 } 17 int sum[N<<5],L[N<<5],R[N<<5]; 18 int a[N],b[N],rt[N]; 19 int n,q,m,cnt=0; 20 void update(int last,int &now,int l,int r,int x){ 21 sum[now=++cnt]=sum[last]+1; 22 if(l==r) return; 23 int mid=(l+r)>>1; 24 if(x<=mid) R[now]=R[last],update(L[last],L[now],l,mid,x); 25 else L[now]=L[last],update(R[last],R[now],mid+1,r,x); 26 } 27 int query(int u,int v,int l,int r,int k){ 28 if(l>=r) return l; 29 int x=sum[L[v]]-sum[L[u]]; 30 int mid=(l+r)>>1; 31 if(x>=k) return query(L[u],L[v],l,mid,k); 32 else return query(R[u],R[v],mid+1,r,k-x); 33 } 34 int main(){ 35 //freopen("testdata.in","r",stdin); 36 n=read(),q=read(); 37 for(int i=1;i<=n;++i) 38 b[i]=a[i]=read(); 39 sort(b+1,b+1+n); 40 m=unique(b+1,b+1+n)-b-1; 41 for(int i=1;i<=n;++i){ 42 int k=lower_bound(b+1,b+1+m,a[i])-b; 43 update(rt[i-1],rt[i],1,m,k); 44 } 45 while(q--){ 46 int x,y,z; 47 x=read(),y=read(),z=read(); 48 int k=query(rt[x-1],rt[y],1,m,z); 49 printf("%d ",b[k]); 50 } 51 return 0; 52 }