二分查找法
//
// main.cpp
// PATA1044
//
// Created by Phoenix on 2018/2/12.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 100010;
const int inf = 1000000000;
int a[maxn];
int ans[maxn] = {0};
int num[maxn][2];
int main(int argc, const char * argv[]) {
int n, m;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
ans[i] = ans[i - 1] + a[i];
num[i][1] = inf;
}
for(int i = 1; i <= maxn; i++) {
int j = i, k = n;
while(j <= k) {
int mid = (j + k) / 2;
int temp = ans[mid] - ans[i - 1];
if(temp - a[mid] < m && temp >= m) {
num[i][0] = mid;
num[i][1] = temp - m;
break;
}
if(temp - a[mid] >= m) {
k = mid - 1;
}
if(temp < m) {
j = mid + 1;
}
}
}
vector<int> v;
int optvalue = inf;
for(int i = 1; i <= n; i++) {
if(num[i][1] < optvalue) {
v.clear();
optvalue = num[i][1];
v.push_back(i);
}else if(num[i][1] == optvalue) {
v.push_back(i);
}
}
for(int i = 0; i < v.size(); i++) {
printf("%d-%d\n", v[i], num[v[i]][0]);
}
return 0;
}