#include <algorithm>
#include <chrono>
#include <iostream>
#include <random>
template <typename X>
const X& max_3_left( const X& a, const X& b, const X& c )
{
return std::max( std::max( a, b ), c );
}
template <typename X>
const X& max_3_right( const X& a, const X& b, const X& c )
{
return std::max( a, std::max( b, c ) );
}
int main()
{
std::random_device r;
std::default_random_engine e1( r() );
std::uniform_int_distribution<int> uniform_dist( 1, 6 );
std::vector<int> numbers;
for ( int i = 0; i < 1000; ++i )
numbers.push_back( uniform_dist( e1 ) );
auto start1 = std::chrono::high_resolution_clock::now();
int sum1 = 0;
for ( int i = 0; i < 1000; ++i )
for ( int j = 0; j < 1000; ++j )
for ( int k = 0; k < 100; ++k )
sum1 += max_3_left( numbers[i], numbers[j], numbers[k] );
auto finish1 = std::chrono::high_resolution_clock::now();
std::cout << "left " << sum1 << " " <<
std::chrono::duration_cast<std::chrono::microseconds>(finish1 - start1).count()
<< " us" << std::endl;
auto start2 = std::chrono::high_resolution_clock::now();
int sum2 = 0;
for ( int i = 0; i < 1000; ++i )
for ( int j = 0; j < 1000; ++j )
for ( int k = 0; k < 100; ++k )
sum2 += max_3_right( numbers[i], numbers[j], numbers[k] );
auto finish2 = std::chrono::high_resolution_clock::now();
std::cout << "right " << sum2 << " " <<
std::chrono::duration_cast<std::chrono::microseconds>(finish2 - start2).count()
<< " us" << std::endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFg+CmNvbnN0IFgmIG1heF8zX2xlZnQoIGNvbnN0IFgmIGEsIGNvbnN0IFgmIGIsIGNvbnN0IFgmIGMgKQp7CiAgICByZXR1cm4gc3RkOjptYXgoIHN0ZDo6bWF4KCBhLCBiICksIGMgKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFg+CmNvbnN0IFgmIG1heF8zX3JpZ2h0KCBjb25zdCBYJiBhLCBjb25zdCBYJiBiLCBjb25zdCBYJiBjICkKewogICAgcmV0dXJuIHN0ZDo6bWF4KCBhLCBzdGQ6Om1heCggYiwgYyApICk7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjpyYW5kb21fZGV2aWNlIHI7CiAgICBzdGQ6OmRlZmF1bHRfcmFuZG9tX2VuZ2luZSBlMSggcigpICk7CiAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IHVuaWZvcm1fZGlzdCggMSwgNiApOwogICAgc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzOwogICAgZm9yICggaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpICkKICAgICAgICBudW1iZXJzLnB1c2hfYmFjayggdW5pZm9ybV9kaXN0KCBlMSApICk7CgogICAgYXV0byBzdGFydDEgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGludCBzdW0xID0gMDsKICAgIGZvciAoIGludCBpID0gMDsgaSA8IDEwMDA7ICsraSApCiAgICAgICAgZm9yICggaW50IGogPSAwOyBqIDwgMTAwMDsgKytqICkKICAgICAgICAgICAgZm9yICggaW50IGsgPSAwOyBrIDwgMTAwOyArK2sgKQogICAgICAgICAgICAgICAgc3VtMSArPSBtYXhfM19sZWZ0KCBudW1iZXJzW2ldLCBudW1iZXJzW2pdLCBudW1iZXJzW2tdICk7CiAgICBhdXRvIGZpbmlzaDEgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIHN0ZDo6Y291dCA8PCAibGVmdCAgIiA8PCBzdW0xIDw8ICIgIiA8PAogICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KGZpbmlzaDEgLSBzdGFydDEpLmNvdW50KCkKICAgICAgICA8PCAiIHVzIiA8PCBzdGQ6OmVuZGw7CgogICAgYXV0byBzdGFydDIgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGludCBzdW0yID0gMDsKICAgIGZvciAoIGludCBpID0gMDsgaSA8IDEwMDA7ICsraSApCiAgICAgICAgZm9yICggaW50IGogPSAwOyBqIDwgMTAwMDsgKytqICkKICAgICAgICAgICAgZm9yICggaW50IGsgPSAwOyBrIDwgMTAwOyArK2sgKQogICAgICAgICAgICAgICAgc3VtMiArPSBtYXhfM19yaWdodCggbnVtYmVyc1tpXSwgbnVtYmVyc1tqXSwgbnVtYmVyc1trXSApOwogICAgYXV0byBmaW5pc2gyID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICBzdGQ6OmNvdXQgPDwgInJpZ2h0ICIgPDwgc3VtMiA8PCAiICIgPDwKICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPihmaW5pc2gyIC0gc3RhcnQyKS5jb3VudCgpCiAgICAgICAgPDwgIiB1cyIgPDwgc3RkOjplbmRsOwp9