Find the answer
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll sum[N<<2];
int a[N],b[N],v[N*4],ans[N];
void up(int o,int l,int r,int k){
if(l==r){
sum[o]+=b[l];
v[o]++;
return;
}
int m=(l+r)>>1;
if(k<=m)
up(o*2,l,m,k);
else up(o*2+1,m+1,r,k);
sum[o]=sum[o*2]+sum[o*2+1];
v[o]=v[o*2]+v[o*2+1];
}
int qu(int o,int l,int r,ll x){
if(l==r){
return (x+(b[l]-1))/b[l];
}
int m=(l+r)>>1;
if(sum[o*2+1]<x)
return qu(o*2,l,m,x-sum[o*2+1])+v[o*2+1];
return qu(o*2+1,m+1,r,x);
}
int main(){
int q;
scanf("%d",&q);
while(q--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
int sz=unique(b+1,b+1+n)-b-1;
for(int i=0;i<=sz*4;i++)
sum[i]=v[i]=0;
ll res=0;
for(int i=1;i<=n;i++){
int cnt=0;
res+=a[i];
if(res>m)
cnt=qu(1,1,sz,res-m);
int k=lower_bound(b+1,b+1+sz,a[i])-b;
up(1,1,sz,k);
printf("%d ",cnt);
}
printf("\n");
}
}