#include <bits/stdc++.h>
using namespace std;
// AtMost(K) -> finding the number of subarrays
// whose sum is less than or equal to K
int atMost( int a[ ] , int n, int k)
{
int cnt = 0 ;
int sum = 0 ;
int i = 0 , j = 0 ;
while ( j < n)
{
// Do calculation:
// Add the current j index element to the window
sum = sum + a[ j] ;
// If the current window sum is <= k
if ( sum <= k)
{
// All subarrays ending at j and starting
// from i, i+1, ..., j have sum <= k.
// Number of such subarrays = j-i+1
cnt = cnt + ( j - i + 1 ) ;
// Move j forward to explore the next element
j++ ;
}
else if ( sum > k)
{
// Shrink the window until sum <= k
while ( i <= j && sum > k)
{
// Remove the element at index i
sum = sum - a[ i] ;
// Move i forward
i++ ;
}
// After shrinking, if sum <= k,
// we have a valid window ending at j.
if ( sum <= k)
{
// Count all valid subarrays ending at j
cnt = cnt + ( j - i + 1 ) ;
// Move j forward
j++ ;
}
}
}
return cnt;
}
int main( )
{
int n = 5 ;
int a[ ] = { 1 , 11 , 2 , 3 , 15 } ;
int k = 10 ;
// Number of subarrays with sum <= k
int atK = atMost( a, n, k) ;
// Number of subarrays with sum <= k-1
int atKminus1 = atMost( a, n, k - 1 ) ;
// Exact K = AtMost(K) - AtMost(K-1)
int ans = atK - atKminus1;
cout << ans << endl;
return 0 ;
}
/*
important point: our current code has special conditions for sum != 0 and sum == 0. We don't need those conditions in the standard atMost() logic. We can simplify the code while preserving your pointer-based approach.
Suppose we want subarrays with sum exactly K = 10.
- AtMost(10) counts every subarray whose sum is at most 10.
- AtMost(9) counts every subarray whose sum is at most 9.
- Subtracting removes all the subarrays with sum less than 10.
*/
CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gQXRNb3N0KEspIC0+IGZpbmRpbmcgdGhlIG51bWJlciBvZiBzdWJhcnJheXMKLy8gd2hvc2Ugc3VtIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBLCmludCBhdE1vc3QoaW50IGFbXSwgaW50IG4sIGludCBrKQp7CiAgICBpbnQgY250ID0gMDsKICAgIGludCBzdW0gPSAwOwoKICAgIGludCBpID0gMCwgaiA9IDA7CgogICAgd2hpbGUgKGogPCBuKQogICAgewogICAgICAgIC8vIERvIGNhbGN1bGF0aW9uOgogICAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBqIGluZGV4IGVsZW1lbnQgdG8gdGhlIHdpbmRvdwogICAgICAgIHN1bSA9IHN1bSArIGFbal07CgogICAgICAgIC8vIElmIHRoZSBjdXJyZW50IHdpbmRvdyBzdW0gaXMgPD0gawogICAgICAgIGlmIChzdW0gPD0gaykKICAgICAgICB7CiAgICAgICAgICAgIC8vIEFsbCBzdWJhcnJheXMgZW5kaW5nIGF0IGogYW5kIHN0YXJ0aW5nCiAgICAgICAgICAgIC8vIGZyb20gaSwgaSsxLCAuLi4sIGogaGF2ZSBzdW0gPD0gay4KICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHN1Y2ggc3ViYXJyYXlzID0gai1pKzEKICAgICAgICAgICAgY250ID0gY250ICsgKGogLSBpICsgMSk7CgogICAgICAgICAgICAvLyBNb3ZlIGogZm9yd2FyZCB0byBleHBsb3JlIHRoZSBuZXh0IGVsZW1lbnQKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdW0gPiBrKQogICAgICAgIHsKICAgICAgICAgICAgLy8gU2hyaW5rIHRoZSB3aW5kb3cgdW50aWwgc3VtIDw9IGsKICAgICAgICAgICAgd2hpbGUgKGkgPD0gaiAmJiBzdW0gPiBrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGVsZW1lbnQgYXQgaW5kZXggaQogICAgICAgICAgICAgICAgc3VtID0gc3VtIC0gYVtpXTsKCiAgICAgICAgICAgICAgICAvLyBNb3ZlIGkgZm9yd2FyZAogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBBZnRlciBzaHJpbmtpbmcsIGlmIHN1bSA8PSBrLAogICAgICAgICAgICAvLyB3ZSBoYXZlIGEgdmFsaWQgd2luZG93IGVuZGluZyBhdCBqLgogICAgICAgICAgICBpZiAoc3VtIDw9IGspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENvdW50IGFsbCB2YWxpZCBzdWJhcnJheXMgZW5kaW5nIGF0IGoKICAgICAgICAgICAgICAgIGNudCA9IGNudCArIChqIC0gaSArIDEpOwoKICAgICAgICAgICAgICAgIC8vIE1vdmUgaiBmb3J3YXJkCiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGNudDsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgbiA9IDU7CiAgICBpbnQgYVtdID0gezEsIDExLCAyLCAzLCAxNX07CgogICAgaW50IGsgPSAxMDsKCiAgICAvLyBOdW1iZXIgb2Ygc3ViYXJyYXlzIHdpdGggc3VtIDw9IGsKICAgIGludCBhdEsgPSBhdE1vc3QoYSwgbiwgayk7CgogICAgLy8gTnVtYmVyIG9mIHN1YmFycmF5cyB3aXRoIHN1bSA8PSBrLTEKICAgIGludCBhdEttaW51czEgPSBhdE1vc3QoYSwgbiwgayAtIDEpOwoKICAgIC8vIEV4YWN0IEsgPSBBdE1vc3QoSykgLSBBdE1vc3QoSy0xKQogICAgaW50IGFucyA9IGF0SyAtIGF0S21pbnVzMTsKCiAgICBjb3V0IDw8IGFucyA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9CgovKgppbXBvcnRhbnQgcG9pbnQ6IG91ciBjdXJyZW50IGNvZGUgaGFzIHNwZWNpYWwgY29uZGl0aW9ucyBmb3Igc3VtICE9IDAgYW5kIHN1bSA9PSAwLiBXZSBkb24ndCBuZWVkIHRob3NlIGNvbmRpdGlvbnMgaW4gdGhlIHN0YW5kYXJkIGF0TW9zdCgpIGxvZ2ljLiBXZSBjYW4gc2ltcGxpZnkgdGhlIGNvZGUgd2hpbGUgcHJlc2VydmluZyB5b3VyIHBvaW50ZXItYmFzZWQgYXBwcm9hY2guCgpTdXBwb3NlIHdlIHdhbnQgc3ViYXJyYXlzIHdpdGggc3VtIGV4YWN0bHkgSyA9IDEwLgotIEF0TW9zdCgxMCkgY291bnRzIGV2ZXJ5IHN1YmFycmF5IHdob3NlIHN1bSBpcyBhdCBtb3N0IDEwLgotIEF0TW9zdCg5KSBjb3VudHMgZXZlcnkgc3ViYXJyYXkgd2hvc2Ugc3VtIGlzIGF0IG1vc3QgOS4KLSBTdWJ0cmFjdGluZyByZW1vdmVzIGFsbCB0aGUgc3ViYXJyYXlzIHdpdGggc3VtIGxlc3MgdGhhbiAxMC4KKi8=