//因为法3用递归难以判断始末位置,所以法3不能用。
//1:法4改造1:
//与法4不同在于负数+0的处理,不能动>和<号,不然出大问题,只能单独判定这一种情况
//负数+0应该开始和结尾都应输出0,也就是输出三个0
#include <iostream>
#define MAXN 100010
using namespace std;
int main(){
int N;
cin>>N;
int a[MAXN];
int cnt=-1;
for(int i=0;i<N;i++){
cin>>a[i];
if(a[i]==0&&cnt==-1){
cnt=i;
}
}
int MaxSum=0,ThisSum=0;
int start=a[0],end=a[N-1],count=0;
for(int i=0;i<N;i++){
ThisSum+=a[i];
count++;
if(ThisSum>MaxSum) {
MaxSum=ThisSum;
start=a[i-count+1];
end=a[i];
}
if(ThisSum<0){
ThisSum=0;
count=0;
}
}
if(MaxSum==0&&cnt!=-1){
cout<<0<<' '<<a[cnt]<<' '<<a[cnt];
}else{
cout<<MaxSum<<' '<<start<<' '<<end;
}
return 0;
}
//2:法4改造2:
//与改造1基本类似
#include <iostream>
#define MAXN 10010
using namespace std;
int main(){
int K;
int a[MAXN];
cin>>K;
int flag=0;
int This_Sum=0,Max_Sum=0;
int This_n=0,Max_n=K;
int start=0,end=K-1;
for(int i=0;i<K;i++){
cin>>a[i];
if(a[i]==0) flag=1;
This_Sum+=a[i];
This_n++;
if(This_Sum>Max_Sum){
Max_Sum=This_Sum;
Max_n=This_n;
end=i;
}
if(This_Sum<0){
This_Sum=0;
This_n=0;
}
}
if(Max_Sum==0 && flag) cout<<Max_Sum<<" "<<0<<" "<<0;
else cout<<Max_Sum<<" "<<a[end-Max_n+1]<<" "<<a[end];
return 0;
}
//3:法2改造
#include <iostream>
#define MAXN 100010
using namespace std;
int main(){
int K;
scanf("%d",&K);
int a[MAXN];
int flag=0;
for(int i=0;i<K;i++){
scanf("%d",&a[i]);
if(a[i]==0) flag=1;
}
int This_sum=0,Max_sum=0;
int start=0,end=K-1;
for(int i=0;i<K;i++){
This_sum=0;
for(int j=i;j<K;j++){
This_sum+=a[j];
if(This_sum>Max_sum){
Max_sum=This_sum;
start=i;
end=j;
}
}
}
if(Max_sum==0 && flag==1) cout<<Max_sum<<" "<<0<<" "<<0;
else cout<<Max_sum<<" "<<a[start]<<" "<<a[end];
return 0;
}