#include <algorithm>
#include <chrono>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <string>
#include <utility>
#include <numeric>
#include <vector>


template<typename T, typename K>
std::vector<K> sum_elements(const T& beg, const T& end, std::size_t k, K def)
{
 if (k == 0) {
     return std::vector<K>{};
 }
 return sum_elements(beg, end, k, def, [](auto &l, auto &r){ return r+l;});
}

template<typename T, typename K, class BinaryOp>
std::vector<K>
    sum_elements(
            const T& beg,
            const T& end,
            std::size_t k,
            K def,
            BinaryOp op)
{
    std::vector<K> out;
    out.reserve((std::distance(beg, end) - 1)/k + 1);
    for (auto it = beg; it!=end; std::advance(it, std::min(static_cast<std::size_t>(std::distance(it, end)), k)))
    {
        out.push_back(std::accumulate(it, std::next(it, std::min(static_cast<std::size_t>(std::distance(it, end)), k)), def, op));
    }
    return out;
}

int main()
{
    std::vector<int> vec;
    auto size = 1000000;
    vec.reserve(size);
    for (int i=0; i < size; ++i)
        vec.push_back(i);
    auto beg = std::chrono::system_clock::now();
    auto sum = 0;
    for (int i=0; i < 100; i++)
        sum += sum_elements(vec.begin(), vec.end(), 2, 0).size();
    auto end = std::chrono::system_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::microseconds>(end-beg).count() << std::endl;
    std::cout << sum << std::endl;

    return sum;
}
