#include <iostream> //二分法寻找元素的方法
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxn = 10011;
int n,m,dim[Maxn];
int flag =0; //是否找到解
void binaryS(int i) //二分查找右边的坐标
{
int l=i,r = n,sum=0;
while(l<=r)
{
int mid = (l+r)/2;
sum = dim[mid] - dim[i-1];
if(sum == m)
{
printf("%d-%d\n",i,mid);
flag = 1;
return;
}
else if(sum < m)
l = mid + 1;
else if(sum > m)
r = mid - 1;
}
}
int main()
{
// freopen("1.txt","r",stdin);
scanf("%d %d",&n,&m); //总值和面值
fill(dim,dim+n+1,0);
for(int i = 1;i<=n;i++)
{
scanf("%d",&dim[i]);
dim[i]+=dim[i-1]; //得到以i开头的项链价值总数
}
while(flag == 0) //如果没有找到解,使得总值+1继续查找
{
for(int i = 1;i<=n;i++)
{
binaryS(i);
}
m++;
}
return 0;
}
#include <iostream> 二分法寻找第一个大于目标值的做法
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxn = 10001;
int n,m,dim[Maxn],nearm=100000010;
int binaryS(int left,int right,int x) //二分查找右边的坐标
{
int l=left,r = right,sum=0;
while(l<r)
{
int mid = (l+r)/2;
if(dim[mid] <= x)
l = mid + 1;
else if(dim[mid] > x)
r = mid;
}
return l;
}
int main()
{
freopen("1.txt","r",stdin);
scanf("%d %d",&n,&m); //总值和面值
fill(dim,dim+n+1,0);
for(int i = 1;i<=n;i++)
{
scanf("%d",&dim[i]);
dim[i]+=dim[i-1]; //得到以i开头的项链价值总数
}
for(int i = 1;i<=n;i++)
{
int j = binaryS(i,n+1,dim[i-1]+m); //将dim[j] - dim[i-1]=m 转换查询第一个dim[j]大于dim[i-1]+m;
if(dim[j - 1] - dim[i - 1] == m) //因为dim[j]大于 所以要减去1
nearm = m;
else if(j<=n && dim[j] - dim[i-1] < nearm)
nearm = dim[j] - dim[i-1];
}
for(int i = 1;i<=n;i++)
{
int j = binaryS(i,n+1,dim[i-1]+nearm);
if(dim[j - 1] - dim[i - 1] == nearm)
printf("%d-%d\n",i,j-1);
}
return 0;
}