思路是先排序,然后求前缀和,再二分寻找第一个大于0的数,前缀和相减求和即可
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 5e5+10;
long long a[N],b[N];
int main(){
int n,m,op,k,add=0;
cin>>n>>m;
for(int i = 1; i <= n; i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i = 1; i <= n; i++){
b[i] = b[i-1] + a[i];
}
while(m-- > 0){
cin>>op;
if(op == 1){
cin>>k;
add += k;
}else{
int l = 1,r = n;
while(l < r){
int mid = (l + r)/2;
if(a[mid] + add >= 0){
r = mid;
}else{
l = mid + 1;
}
}
if(a[l] + add >= 0){
printf("%lld\n",b[n]-b[l-1]+(n-l+1)*add);
}else{
printf("%lld\n",b[n]-b[l]+(n-l)*add);
}
}
}
return 0;
}