#include <iostream>
#include <vector>
#include <numeric>
#include <limits>
int main()
{
using dvect = std::vector<double>;
using ddvect = std::vector<dvect>;
using dddvect = std::vector<ddvect>;
dddvect mx = { { { 1, 2, 3 }, { -1, 3 }, { 8,-2, 3 } },
{ {}, { -1, 25, 3 }, { 7, 3, 3 } },
{ { -1, -2, -3 }, {}, { 33 } } };
struct max_value {
size_t i = 0;
size_t j = 0;
size_t k = 0;
double value = -std::numeric_limits<double>::infinity();
max_value() = default;
max_value( size_t i, size_t j, size_t k, double v ) : i( i ), j( j ), k( k ), value( v ) {}
max_value operator<<( const max_value &v ) const
{
return value > v.value ? *this : v;
}
};
size_t i = 0;
auto max = std::accumulate( mx.begin(), mx.end(), max_value{}, [&mx]( const max_value &val, const ddvect &ddv ) {
auto i = std::distance( &*mx.cbegin(), &ddv );
return std::accumulate( ddv.begin(), ddv.end(), val, [i,&ddv]( const max_value &val, const dvect &dv ) {
auto j = std::distance( &*ddv.cbegin(), &dv );
return std::accumulate( dv.begin(), dv.end(), val, [i,j,&dv]( const max_value &val, const double &d ) {
auto k = std::distance( &*dv.cbegin(), &d );
return val << max_value( i, j, k, d );
} );
} );
} );
std::cout << "max value " << max.value << "[" << max.i << "," << max.j << "," << max.k << "]" << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPGxpbWl0cz4KCmludCBtYWluKCkKewogICAgdXNpbmcgZHZlY3QgPSBzdGQ6OnZlY3Rvcjxkb3VibGU+OwogICAgdXNpbmcgZGR2ZWN0ID0gc3RkOjp2ZWN0b3I8ZHZlY3Q+OwogICAgdXNpbmcgZGRkdmVjdCA9IHN0ZDo6dmVjdG9yPGRkdmVjdD47CiAgICBkZGR2ZWN0IG14ID0geyB7IHsgMSwgMiwgMyB9LCB7IC0xLCAzIH0sIHsgOCwtMiwgMyB9IH0sCiAgICAgICAgICAgICAgICAgICB7IHt9LCB7IC0xLCAyNSwgMyB9LCB7IDcsIDMsIDMgfSB9LAogICAgICAgICAgICAgICAgICAgeyB7IC0xLCAtMiwgLTMgfSwge30sIHsgMzMgfSB9IH07CgogICAgc3RydWN0IG1heF92YWx1ZSB7CiAgICAgICAgc2l6ZV90IGkgPSAwOwogICAgICAgIHNpemVfdCBqID0gMDsKICAgICAgICBzaXplX3QgayA9IDA7CgogICAgICAgIGRvdWJsZSB2YWx1ZSA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CgogICAgICAgIG1heF92YWx1ZSgpID0gZGVmYXVsdDsKICAgICAgICBtYXhfdmFsdWUoIHNpemVfdCBpLCBzaXplX3Qgaiwgc2l6ZV90IGssIGRvdWJsZSB2ICkgOiBpKCBpICksIGooIGogKSwgayggayApLCB2YWx1ZSggdiApIHt9CgogICAgICAgIG1heF92YWx1ZSBvcGVyYXRvcjw8KCBjb25zdCBtYXhfdmFsdWUgJnYgKSBjb25zdAogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlID4gdi52YWx1ZSA/ICp0aGlzIDogdjsKICAgICAgICB9CgogICAgfTsKCiAgICBzaXplX3QgaSA9IDA7CiAgICBhdXRvIG1heCA9IHN0ZDo6YWNjdW11bGF0ZSggbXguYmVnaW4oKSwgbXguZW5kKCksIG1heF92YWx1ZXt9LCBbJm14XSggY29uc3QgbWF4X3ZhbHVlICZ2YWwsIGNvbnN0IGRkdmVjdCAmZGR2ICkgewogICAgICAgIGF1dG8gaSA9IHN0ZDo6ZGlzdGFuY2UoICYqbXguY2JlZ2luKCksICZkZHYgKTsKICAgICAgICByZXR1cm4gc3RkOjphY2N1bXVsYXRlKCBkZHYuYmVnaW4oKSwgZGR2LmVuZCgpLCB2YWwsIFtpLCZkZHZdKCBjb25zdCBtYXhfdmFsdWUgJnZhbCwgY29uc3QgZHZlY3QgJmR2ICkgewogICAgICAgICAgICBhdXRvIGogPSBzdGQ6OmRpc3RhbmNlKCAmKmRkdi5jYmVnaW4oKSwgJmR2ICk7CiAgICAgICAgICAgIHJldHVybiBzdGQ6OmFjY3VtdWxhdGUoIGR2LmJlZ2luKCksIGR2LmVuZCgpLCB2YWwsIFtpLGosJmR2XSggY29uc3QgbWF4X3ZhbHVlICZ2YWwsIGNvbnN0IGRvdWJsZSAmZCApIHsKICAgICAgICAgICAgICAgIGF1dG8gayA9IHN0ZDo6ZGlzdGFuY2UoICYqZHYuY2JlZ2luKCksICZkICk7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsIDw8IG1heF92YWx1ZSggaSwgaiwgaywgZCApOwogICAgICAgICAgICB9ICk7CiAgICAgICAgfSApOwogICAgfSApOwoKICAgIHN0ZDo6Y291dCA8PCAibWF4IHZhbHVlICIgPDwgbWF4LnZhbHVlIDw8ICJbIiA8PCBtYXguaSA8PCAiLCIgPDwgbWF4LmogPDwgIiwiIDw8IG1heC5rIDw8ICJdIiA8PCBzdGQ6OmVuZGw7Cn0K