- #include<stdio.h>
- #include<algorithm>
- #include<vector>
- #include<cmath>
- using namespace std;
- const int B = 1000 ;
- const int MAX_N = 100000;
- int nums[200000];
- int L[10000];
- int R[10000];
- int K[10000];
- int A[200000];
- vector<int> bucket[MAX_N/B];
- int main()
- {
- int n,m;
- scanf("%d%d",&n,&m);
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&nums[i]);
- A[i]=nums[i];
- }
- sort(A+1,A+n+1);
- for(int i=1;i<=m;i++)
- scanf("%d%d%d",&L[i],&R[i],&K[i]);
- int l,r;
- for(int i=1;i<=n;i++)
- bucket[i/B].push_back(nums[i]);
- for(int i=0;i<n/B;i++)
- sort(bucket[i].begin(),bucket[i].end());
- for(int i=1;i<=m;i++)
- {
- int l=L[i],r=R[i],k=K[i];
- int lb=0,ub=n;
- while(ub-lb>1)
- {
- int c=0;
- int tl=l,tr=r+1;
- int mid=(ub+lb)/2;
- int x=A[mid];
- while(tl<tr&&tl%B!=0)
- {
- if(nums[tl++]<=x)
- {
- c++;
- }
- }
- while(tl<tr&&tr%B!=0) if(nums[--tr]<=x) c++;
- for(int i=tl/B;i*B+B<=tr;i++)
- {
- c+=upper_bound(bucket[i].begin(),bucket[i].end(),x)-bucket[i].begin();
- }
- if(c>=k)//c 满足条件,但是可以更大一点
- ub=mid;
- else
- lb=mid;
- }
- printf("%d\n",A[ub]);
- }
- return 0;
- }
poj 分桶法和平方分割
最新推荐文章于 2020-07-13 13:56:40 发布