#include <iostream>
#include <functional>
using namespace std;
int accum(int * arr, int N, int init, std::function<int(int,int)> f)
{
for(int i = 0; i < N; ++i)
init = f(init,arr[i]);
return init;
}
int prod(int i, int j)
{
return i*j;
}
struct square
{
int operator() (int i, int j) { return i + j*j; }
};
int main(int argc, const char * argv[])
{
int a[] = { 1, 2, 3, 4, 5, 6 };
cout << "Sum = " << accum(a,6,0,[](int i, int j) { return i+j; }) << endl;
cout << "Mul = " << accum(a,6,1,prod) << endl;
cout << "Sq = " << accum(a,6,0,square()) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgYWNjdW0oaW50ICogYXJyLCBpbnQgTiwgaW50IGluaXQsIHN0ZDo6ZnVuY3Rpb248aW50KGludCxpbnQpPiBmKQp7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgTjsgKytpKQogICAgICAgIGluaXQgPSBmKGluaXQsYXJyW2ldKTsKICAgIHJldHVybiBpbml0Owp9CgppbnQgcHJvZChpbnQgaSwgaW50IGopCnsKICAgIHJldHVybiBpKmo7Cn0KCnN0cnVjdCBzcXVhcmUKewogICAgaW50IG9wZXJhdG9yKCkgKGludCBpLCBpbnQgaikgeyByZXR1cm4gaSArIGoqajsgfQp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pCnsKICAgIGludCBhW10gPSB7IDEsIDIsIDMsIDQsIDUsIDYgfTsKICAgIGNvdXQgPDwgIlN1bSA9ICIgPDwgYWNjdW0oYSw2LDAsW10oaW50IGksIGludCBqKSB7IHJldHVybiBpK2o7IH0pIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJNdWwgPSAiIDw8IGFjY3VtKGEsNiwxLHByb2QpIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJTcSAgPSAiIDw8IGFjY3VtKGEsNiwwLHNxdWFyZSgpKSA8PCBlbmRsOwoKfQo=