#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
int a[MAXN]={};
int n,m;
int d[MAXN]={};
int upper_bound(int l,int r,int num){
while(l<r){
int mid=(l+r)/2;
if(d[mid]<num){
l=mid+1;
}else{
r=mid;
}
}
return l;
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
d[i]=d[i-1]+a[i];
}
int realm=1000000000;
for(int i=0;i<=n;i++){
int t=upper_bound(i,n+1,d[i]+m);
if(d[t]==d[i]+m){
realm=m;break;
}else{
if(t<=n){
realm=min(realm,d[t]-d[i]);
//cout<<realm<<endl;
}
}
}
for(int i=0;i<=n;i++){
int t=upper_bound(i,n+1,d[i]+realm);
if(d[t]==d[i]+realm){
printf("%d-%d\n",i+1,t);
}
}
return 0;
}
考察二分法查找第一个大于等于m的位置;
保证t<=n是指此时存在一个大于等于m的d值,不加限制的话可能会有t=n+1的情况,此时realm就会变成负的而出错;
MAXN大于10^5;
upper_bound函数中的right应该写成n+1,指向不存在