将给定区间分块,将每个块从小到大排序,二分查询每个块,
#include#define mem(a,b) memset(a,b,sizeof(a))#define sc(x) scanf("%d",&(x))using namespace std;const int maxn=1e5+10;int block,mub,l[maxn],r[maxn],belong[maxn];int arr[maxn],n,m,tt[maxn];void built(){ block=sqrt(n); mub=n/block;if(n%mub) mub++; for(int i=1;i<=mub;i++) l[i]=(i-1)*block+1,r[i]=i*block; r[mub]=n; for(int i=1;i<=n;i++) belong[i]=(i-1)/block+1; for(int i=1;i<=n;i++) sort(tt+l[belong[i]],tt+1+r[belong[i]]);}int query(int a,int b,int c){ int ans=0; if(belong[a]==belong[b]) { for(int i=a;i<=b;i++) if(arr[i]<=c) ans++; } else { for(int i=a;i<=r[belong[a]];i++) if(arr[i]<=c) ans++; for(int i=belong[a]+1;i