Đối với bài toán này, ta không thể áp dụng binary search một cách đơn thuần được, vì mảng có chứa
số âm nên prefix sum sẽ không đơn điệu.
Theo yêu cầu đề bài, ta có:
pref[j]−pref[i−1]≤S⟺pref[i−1]≥pref[j]−S
Lúc này với mọi chỉ số i thoả mãn, ta sẽ lấy chỉ số i nhỏ nhất thoả mãn đồng thời pref[i−1]
phải đủ lớn để thoả pref[i−1]≥pref[j]−S.
Nhận thấy rằng, nếu có hai chỉ số i1<i2 và pref[i1]≥pref[i2], thì ta sẽ luôn luôn
chọn chỉ số i1 vì i1 nhỏ hơn, đồng thời vẫn đủ lớn để thoả điều kiện. Đơn giản là vì nếu giá
trị cực đại của pref[i1] không thoả mãn pref[i1]≥pref[j]−S, thì sẽ không có bất cứ giá
trị nào mà bé hơn pref[i1] thoả mãn được cả.
Từ quan sát trên, gọi candidate[] là danh sách gồm các giá trị pref[i] có thể thoả mãn.
Ban đầu, candidate[0]=0. Và với mỗi chỉ số 0<i≤n, ta sẽ đẩy i vào danh sách nếu
pref[i] lớn hơn giá trị pref[j] cực đại trong candidate. Từ đây candidate[] chỉ gồm các giá
trị pref[j] tăng dần. Lúc này ta có thể áp dụng binary search để tìm pref[i−1] nhỏ nhất thoả mãn
pref[i−1]≥pref[j]−S
Độ phức tạp: O(nlog(n))