#include <algorithm>
#include <type_traits>
namespace fixed {
namespace std {
template <typename InputT, typename T>
auto accumulate (InputT from, InputT to, T init) ->
typename ::std::enable_if <::std::is_same<decltype(init+*from),decltype(init+*from+*from)>::value,
decltype(init+*from)>::type
{
return ::std::accumulate(from, to, decltype(init+*from)(init));
}
template <typename InputT, typename T, typename Op>
auto accumulate (InputT from, InputT to, T init, Op op) ->
typename ::std::enable_if <::std::is_same<decltype(op(init,*from)),decltype(op(op(init,*from),*from))>::value,
decltype(op(init,*from))>::type
{
return ::std::accumulate(from, to, decltype(op(init,*from))(init));
}
}
}
#include <iterator>
#include <iostream>
int main ()
{
int foo[] {1,2,3};
std::cout << fixed::std::accumulate (std::begin(foo), std::end(foo), 0.5) << std::endl;
double bar[] {1.1,2.2,3.3};
std::cout << fixed::std::accumulate (std::begin(bar), std::end(bar), 0) << std::endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKbmFtZXNwYWNlIGZpeGVkIHsKICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dFQsIHR5cGVuYW1lIFQ+CiAgICAgICAgICAgIGF1dG8gYWNjdW11bGF0ZSAoSW5wdXRUIGZyb20sIElucHV0VCB0bywgVCBpbml0KSAtPgogICAgICAgICAgICAgIHR5cGVuYW1lIDo6c3RkOjplbmFibGVfaWYgPDo6c3RkOjppc19zYW1lPGRlY2x0eXBlKGluaXQrKmZyb20pLGRlY2x0eXBlKGluaXQrKmZyb20rKmZyb20pPjo6dmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKGluaXQrKmZyb20pPjo6dHlwZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIDo6c3RkOjphY2N1bXVsYXRlKGZyb20sIHRvLCBkZWNsdHlwZShpbml0Kypmcm9tKShpbml0KSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRULCB0eXBlbmFtZSBULCB0eXBlbmFtZSBPcD4KICAgICAgICAgICAgYXV0byBhY2N1bXVsYXRlIChJbnB1dFQgZnJvbSwgSW5wdXRUIHRvLCBUIGluaXQsIE9wIG9wKSAtPgogICAgICAgICAgICAgIHR5cGVuYW1lIDo6c3RkOjplbmFibGVfaWYgPDo6c3RkOjppc19zYW1lPGRlY2x0eXBlKG9wKGluaXQsKmZyb20pKSxkZWNsdHlwZShvcChvcChpbml0LCpmcm9tKSwqZnJvbSkpPjo6dmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKG9wKGluaXQsKmZyb20pKT46OnR5cGUKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHJldHVybiA6OnN0ZDo6YWNjdW11bGF0ZShmcm9tLCB0bywgZGVjbHR5cGUob3AoaW5pdCwqZnJvbSkpKGluaXQpKTsKICAgICAgICAgICAgICB9CgogICAgfQp9CgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxpb3N0cmVhbT4KaW50IG1haW4gKCkKewogICAgaW50IGZvb1tdIHsxLDIsM307CiAgICBzdGQ6OmNvdXQgPDwgZml4ZWQ6OnN0ZDo6YWNjdW11bGF0ZSAoc3RkOjpiZWdpbihmb28pLCBzdGQ6OmVuZChmb28pLCAwLjUpIDw8IHN0ZDo6ZW5kbDsKICAgIGRvdWJsZSBiYXJbXSB7MS4xLDIuMiwzLjN9OwogICAgc3RkOjpjb3V0IDw8IGZpeGVkOjpzdGQ6OmFjY3VtdWxhdGUgKHN0ZDo6YmVnaW4oYmFyKSwgc3RkOjplbmQoYmFyKSwgMCkgPDwgc3RkOjplbmRsOwp9