#include <algorithm>
#include <iterator>
#include <iostream>
#include <numeric>
#include <ostream>
#include <utility>
#include <vector>
// __________________________________________________
template<typename RandomAccessIterator> typename std::iterator_traits<RandomAccessIterator>::value_type
max_subarr_k(RandomAccessIterator first,RandomAccessIterator last,int k)
{
using namespace std;
typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
if(distance(first,last) < k)
return value_type(0);
RandomAccessIterator tail=first;
first+=k;
value_type window=accumulate(tail,first,value_type(0));
value_type max_sum=window, current_sum=window;
while(first!=last)
{
window += (*first)-(*tail) ;
current_sum = max( current_sum+(*first), window );
max_sum = max(max_sum,current_sum);
++first;
++tail;
}
return max_sum;
}
// __________________________________________________
template<typename E,int N>
E *end(E (&arr)[N])
{
return arr+N;
}
int main()
{
using namespace std;
int arr[]={1,2,4,-5,-4,-3,2,1,5,6,-20,1,1,1,1,1};
cout << max_subarr_k(arr,end(arr),4) << endl;
cout << max_subarr_k(arr,end(arr),5) << endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8b3N0cmVhbT4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx2ZWN0b3I+CgovLyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKdGVtcGxhdGU8dHlwZW5hbWUgUmFuZG9tQWNjZXNzSXRlcmF0b3I+IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPFJhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQptYXhfc3ViYXJyX2soUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsUmFuZG9tQWNjZXNzSXRlcmF0b3IgbGFzdCxpbnQgaykKewogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPFJhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwogICAgaWYoZGlzdGFuY2UoZmlyc3QsbGFzdCkgPCBrKQogICAgICAgIHJldHVybiB2YWx1ZV90eXBlKDApOwogICAgUmFuZG9tQWNjZXNzSXRlcmF0b3IgdGFpbD1maXJzdDsKICAgIGZpcnN0Kz1rOwogICAgdmFsdWVfdHlwZSB3aW5kb3c9YWNjdW11bGF0ZSh0YWlsLGZpcnN0LHZhbHVlX3R5cGUoMCkpOwogICAgdmFsdWVfdHlwZSBtYXhfc3VtPXdpbmRvdywgY3VycmVudF9zdW09d2luZG93OwogICAgd2hpbGUoZmlyc3QhPWxhc3QpCiAgICB7CiAgICAgICAgd2luZG93ICs9ICgqZmlyc3QpLSgqdGFpbCkgOwogICAgICAgIGN1cnJlbnRfc3VtID0gbWF4KCBjdXJyZW50X3N1bSsoKmZpcnN0KSwgd2luZG93ICk7CiAgICAgICAgbWF4X3N1bSA9IG1heChtYXhfc3VtLGN1cnJlbnRfc3VtKTsKICAgICAgICArK2ZpcnN0OwogICAgICAgICsrdGFpbDsKICAgIH0KICAgIHJldHVybiBtYXhfc3VtOwp9CgovLyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKdGVtcGxhdGU8dHlwZW5hbWUgRSxpbnQgTj4KRSAqZW5kKEUgKCZhcnIpW05dKQp7CiAgICByZXR1cm4gYXJyK047Cn0KCmludCBtYWluKCkKewogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIGludCBhcnJbXT17MSwyLDQsLTUsLTQsLTMsMiwxLDUsNiwtMjAsMSwxLDEsMSwxfTsKICAgIGNvdXQgPDwgbWF4X3N1YmFycl9rKGFycixlbmQoYXJyKSw0KSA8PCBlbmRsOwogICAgY291dCA8PCBtYXhfc3ViYXJyX2soYXJyLGVuZChhcnIpLDUpIDw8IGVuZGw7Cn0K