#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cassert>
template <
class Container,
class Operation,
class T = typename Container::value_type,
class size_type = typename Container::size_type>
std::vector<T> sliding_window(const Container & input, size_type m, const Operation & operation) {
size_type input_size = input.size();
if (input_size < m)
return {};
std::vector<T> left_partial, right_partial = {input.back()};
left_partial.reserve(input_size);
right_partial.reserve(input_size + 1);
size_type idx = 0;
{
auto direct_it = input.begin();
auto reverse_it = input.rbegin();
for (; direct_it != input.end(); ++direct_it, ++reverse_it, ++idx) {
left_partial.push_back(idx % m
? operation(left_partial[idx - 1], *direct_it)
: *direct_it);
right_partial.push_back((input_size - idx) % m
? operation(right_partial[idx], *reverse_it)
: *reverse_it
);
}
}
std::vector<T> result;
size_t result_size = input_size - m + 1;
result.reserve(result_size);
for (size_type i = 0; i < result_size; ++i) {
auto & left_part = right_partial[input_size - i];
auto & right_part = left_partial[i + m - 1];
result.push_back(i % m
? operation(left_part, right_part)
: left_part);
}
return result;
}
int main(){
std::vector<int> v = {3, 10, 11, 10, 0, 0, 0, 1, 2, 3, 2};
auto result_max = sliding_window(v, 3, [] (int x, int y) {return std::max(x, y);});
assert((result_max == decltype(result_max){11, 11, 11, 10, 0, 1, 2, 3, 3}));
auto result_sum = sliding_window(v, 3, [] (int x, int y) {return x + y;});
assert((result_sum == decltype(result_sum){24, 31, 21, 10, 0, 1, 3, 6, 7}));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKdGVtcGxhdGUgPAogICAgICAgIGNsYXNzIENvbnRhaW5lciwKICAgICAgICBjbGFzcyBPcGVyYXRpb24sCiAgICAgICAgY2xhc3MgVCA9IHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZSwKICAgICAgICBjbGFzcyBzaXplX3R5cGUgPSB0eXBlbmFtZSBDb250YWluZXI6OnNpemVfdHlwZT4Kc3RkOjp2ZWN0b3I8VD4gc2xpZGluZ193aW5kb3coY29uc3QgQ29udGFpbmVyICYgaW5wdXQsIHNpemVfdHlwZSBtLCBjb25zdCBPcGVyYXRpb24gJiBvcGVyYXRpb24pIHsKICAgIHNpemVfdHlwZSBpbnB1dF9zaXplID0gaW5wdXQuc2l6ZSgpOwogICAgaWYgKGlucHV0X3NpemUgPCBtKQogICAgICAgIHJldHVybiB7fTsKICAgIHN0ZDo6dmVjdG9yPFQ+IGxlZnRfcGFydGlhbCwgcmlnaHRfcGFydGlhbCA9IHtpbnB1dC5iYWNrKCl9OwogICAgbGVmdF9wYXJ0aWFsLnJlc2VydmUoaW5wdXRfc2l6ZSk7CiAgICByaWdodF9wYXJ0aWFsLnJlc2VydmUoaW5wdXRfc2l6ZSArIDEpOwogICAgc2l6ZV90eXBlIGlkeCA9IDA7CiAgICB7CiAgICAgICAgYXV0byBkaXJlY3RfaXQgPSBpbnB1dC5iZWdpbigpOwogICAgICAgIGF1dG8gcmV2ZXJzZV9pdCA9IGlucHV0LnJiZWdpbigpOwogICAgICAgIGZvciAoOyBkaXJlY3RfaXQgIT0gaW5wdXQuZW5kKCk7ICsrZGlyZWN0X2l0LCArK3JldmVyc2VfaXQsICsraWR4KSB7CiAgICAgICAgICAgIGxlZnRfcGFydGlhbC5wdXNoX2JhY2soaWR4ICUgbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcGVyYXRpb24obGVmdF9wYXJ0aWFsW2lkeCAtIDFdLCAqZGlyZWN0X2l0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAqZGlyZWN0X2l0KTsKICAgICAgICAgICAgcmlnaHRfcGFydGlhbC5wdXNoX2JhY2soKGlucHV0X3NpemUgLSBpZHgpICUgbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3BlcmF0aW9uKHJpZ2h0X3BhcnRpYWxbaWR4XSwgKnJldmVyc2VfaXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAqcmV2ZXJzZV9pdAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBzdGQ6OnZlY3RvcjxUPiByZXN1bHQ7CiAgICBzaXplX3QgcmVzdWx0X3NpemUgPSBpbnB1dF9zaXplIC0gbSArIDE7CiAgICByZXN1bHQucmVzZXJ2ZShyZXN1bHRfc2l6ZSk7CiAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IHJlc3VsdF9zaXplOyArK2kpIHsKICAgICAgICBhdXRvICYgbGVmdF9wYXJ0ID0gcmlnaHRfcGFydGlhbFtpbnB1dF9zaXplIC0gaV07CiAgICAgICAgYXV0byAmIHJpZ2h0X3BhcnQgPSBsZWZ0X3BhcnRpYWxbaSArIG0gLSAxXTsKCiAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhpICUgbQogICAgICAgICAgICAgICAgICAgICAgICAgPyBvcGVyYXRpb24obGVmdF9wYXJ0LCByaWdodF9wYXJ0KQogICAgICAgICAgICAgICAgICAgICAgICAgOiBsZWZ0X3BhcnQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKaW50IG1haW4oKXsKICAgIHN0ZDo6dmVjdG9yPGludD4gdiA9IHszLCAxMCwgMTEsIDEwLCAwLCAwLCAwLCAxLCAyLCAzLCAyfTsKICAgIGF1dG8gcmVzdWx0X21heCA9IHNsaWRpbmdfd2luZG93KHYsIDMsIFtdIChpbnQgeCwgaW50IHkpIHtyZXR1cm4gc3RkOjptYXgoeCwgeSk7fSk7CiAgICBhc3NlcnQoKHJlc3VsdF9tYXggPT0gZGVjbHR5cGUocmVzdWx0X21heCl7MTEsIDExLCAxMSwgMTAsIDAsIDEsIDIsIDMsIDN9KSk7CgogICAgYXV0byByZXN1bHRfc3VtID0gc2xpZGluZ193aW5kb3codiwgMywgW10gKGludCB4LCBpbnQgeSkge3JldHVybiB4ICsgeTt9KTsKICAgIGFzc2VydCgocmVzdWx0X3N1bSA9PSBkZWNsdHlwZShyZXN1bHRfc3VtKXsyNCwgMzEsIDIxLCAxMCwgMCwgMSwgMywgNiwgN30pKTsKICAgIHJldHVybiAwOwp9CgoK