没见过CE求助的叭你还好意思
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
void read(int &x){
short f=1;char ch=getchar();x=0;
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}while(isdigit(ch)){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}x*=f;
}
#define maxn 100010
int a[maxn];
vector<int>v[400];
int pos[maxn],L[400],R[400];
int n,m,t;
int l,r,k;
int o[maxn];
int count(int x,int l,int r){
int p=pos[l],q=pos[r];
int ans=0;
if(p==q){
for(int i=l;i<=r;i++)ans+=a[i]<=x;
return ans;
}
for(int i=p+1;i<=q-1;i++)ans+=upper_bound(v[i].begin(),v[i].end(),x)-v[i].begin();
for(int i=l;i<=R[p];i++)ans+=a[i]<=x;
for(int i=L[q];i<=r;i++)ans+=a[i]<=x;
return ans;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("testdata.in","r",stdin);
#endif
read(n),read(m);
for(int i=1;i<=n;i++)read(a[i]);
for(int i=1;i<=n;i++)o[i]=a[i];
sort(o+1,o+n+1);
t=sqrt(n);
// cout<<n<<' '<<m<<' '<<t<<endl;
for(int i=1;i<=t;i++){
L[i]=(i-1)*sqrt(n)+1;
R[i]=i*sqrt(n);
}
if(R[t]<n)R[++t]=n,L[t]=R[t-1]+1;
for(int i=1;i<=t;i++){
for(int j=L[i];j<=R[i];j++)
pos[j]=i,v[i].push_back(a[j]);
sort(v[i].begin(),v[i].end());
}
// for(int i=1;i<=t;i++,puts(""))
// for(int j=0;j<(int)v[i].size();j++)
// printf("%d ",v[i][j]);
while(m--){
read(l),read(r),read(k);
int ll=1,rr=n,mid;
while(ll<=rr){
mid=(ll+rr)>>1;//check表示[l,r]中是否有k个大于mid
// printf("count(%d,%d,%d) when k is %d is %d\n",o[mid],l,r,k,count(o[mid],l,r));
if(count(o[mid],l,r)>=k)rr=mid-1;
else ll=mid+1;
}
printf("%d\n",o[ll]);
}
}
改bits就可以编译,但是死活不能在POJ上逃脱CE,请路过的dalao们解释以下原理