因为考虑到问题的单调性
直接二分最大最小值然后模拟判断一下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,m,a[100003];
long long l,r,ans1,ans2;
long long calc(long long x){
long long ans=0,sum=0;
for(int i=1;i<=n;i++){
sum=max(0ll,sum+a[i]);
if(sum>=x){
sum=0; ans++;
}
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
l=1;r=99999999999999;
while(l<r){
long long mid=(l+r)>>1;
if(calc(mid)<=m){
r=mid;
}else{
l=mid+1;
}
}
ans1=l;
l=1;r=99999999999999;
while(l<r){
long long mid=(l+r+1)>>1;
if(calc(mid)>=m){
l=mid;
}else{
r=mid-1;
}
}
ans2=r;
if(calc(ans1)!=m||calc(ans2)!=m){
cout<<"-1"<<endl;
}else{
cout<<ans1<<" "<<ans2<<endl;
}
return 0;
}
/*
in:
4 2
2
5
-3
9
out:
3 7
*/