#include <tuple>
#include <vector>
#include <algorithm>
#include <iostream>
template <typename Tuple, typename T>
Tuple handle(Tuple t, T v)
{
std::get<0>(t) += v;
std::get<1>(t) *= v;
return t;
}
int main()
{
std::vector<int> a = { 1,2,3,4,5,6,7 };
for (auto i=1ul << 12; i;)
{
auto accum = std::make_tuple(0,1);
accum = std::accumulate(a.begin(), a.end(), accum, handle<decltype(accum), int>);
if (!--i)
std::cout << "sum: " << std::get<0>(accum) << ", product: " << std::get<1>(accum) << std::endl;
}
return 0;
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUsIHR5cGVuYW1lIFQ+ClR1cGxlIGhhbmRsZShUdXBsZSB0LCBUIHYpCnsKICAgIHN0ZDo6Z2V0PDA+KHQpICs9IHY7CiAgICBzdGQ6OmdldDwxPih0KSAqPSB2OwogICAgcmV0dXJuIHQ7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjp2ZWN0b3I8aW50PiBhID0geyAxLDIsMyw0LDUsNiw3IH07CgogICAgZm9yIChhdXRvIGk9MXVsIDw8IDEyOyBpOykKICAgIHsKICAgICAgICBhdXRvIGFjY3VtID0gc3RkOjptYWtlX3R1cGxlKDAsMSk7CiAgICAgICAgYWNjdW0gPSBzdGQ6OmFjY3VtdWxhdGUoYS5iZWdpbigpLCBhLmVuZCgpLCBhY2N1bSwgaGFuZGxlPGRlY2x0eXBlKGFjY3VtKSwgaW50Pik7CgogICAgICAgIGlmICghLS1pKQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgInN1bTogIiA8PCBzdGQ6OmdldDwwPihhY2N1bSkgPDwgIiwgcHJvZHVjdDogIiA8PCBzdGQ6OmdldDwxPihhY2N1bSkgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==