#include <chrono>
#include <iostream>
#include <random>
#include <vector>
class stopwatch
{
std::chrono::time_point<std::chrono::high_resolution_clock> last_;
public:
stopwatch()
{
reset();
}
void reset()
{
last_ = std::chrono::high_resolution_clock::now();
}
std::chrono::microseconds elapsed() const
{
auto t = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::microseconds>(t - last_);
}
std::chrono::microseconds tick()
{
auto t = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(t - last_);
last_ = t;
return elapsed;
}
};
template <std::size_t N, typename Iterator>
void foo(Iterator begin, Iterator end)
{
for (; begin != end; ++begin)
{
*begin *= N;
*begin *= N;
*begin *= N;
*begin *= N;
*begin *= N;
}
}
int main()
{
std::vector<unsigned> v;
std::default_random_engine e;
for (unsigned i = 5000000; i-- != 0; )
v.push_back(e());
stopwatch w;
foo<77>(v.begin(), v.end());
std::cout << "Time: " << w.elapsed().count() / 1000000.0 << '\n';
std::cout << v[e() % v.size()] << '\n';
w.reset();
foo<31>(v.begin(), v.end());
std::cout << "Time: " << w.elapsed().count() / 1000000.0 << '\n';
std::cout << v[e() % v.size()] << '\n';
}
I2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8dmVjdG9yPgogCiAKY2xhc3Mgc3RvcHdhdGNoCnsKICBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrPiBsYXN0XzsKcHVibGljOgogIHN0b3B3YXRjaCgpCiAgewogICAgcmVzZXQoKTsKICB9CiAgdm9pZCByZXNldCgpCiAgewogICAgbGFzdF8gPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICB9CiAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBlbGFwc2VkKCkgY29uc3QKICB7CiAgICBhdXRvIHQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPih0IC0gbGFzdF8pOwogIH0KICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHRpY2soKQogIHsKICAgIGF1dG8gdCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgYXV0byBlbGFwc2VkID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4odCAtIGxhc3RfKTsKICAgIGxhc3RfID0gdDsKICAgIHJldHVybiBlbGFwc2VkOwogIH0KfTsgCiAKdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IE4sIHR5cGVuYW1lIEl0ZXJhdG9yPgp2b2lkIGZvbyhJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kKQp7Cglmb3IgKDsgYmVnaW4gIT0gZW5kOyArK2JlZ2luKQoJewoJCSpiZWdpbiAqPSBOOwoJCSpiZWdpbiAqPSBOOwoJCSpiZWdpbiAqPSBOOwoJCSpiZWdpbiAqPSBOOwoJCSpiZWdpbiAqPSBOOwoJfQp9CiAKaW50IG1haW4oKQp7CiAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IHY7CiAgICAgICAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZTsKICAgICAgICAKICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSA1MDAwMDAwOyBpLS0gIT0gMDsgKQogICAgICAgICAgICAgICAgdi5wdXNoX2JhY2soZSgpKTsKIAogICAgICAgIHN0b3B3YXRjaCB3OwogICAgICAgIGZvbzw3Nz4odi5iZWdpbigpLCB2LmVuZCgpKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlRpbWU6ICIgPDwgdy5lbGFwc2VkKCkuY291bnQoKSAvIDEwMDAwMDAuMCA8PCAnXG4nOwogICAgICAgIHN0ZDo6Y291dCA8PCB2W2UoKSAlIHYuc2l6ZSgpXSA8PCAnXG4nOwogCiAgICAgICAgdy5yZXNldCgpOwogICAgICAgIGZvbzwzMT4odi5iZWdpbigpLCB2LmVuZCgpKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlRpbWU6ICIgPDwgdy5lbGFwc2VkKCkuY291bnQoKSAvIDEwMDAwMDAuMCA8PCAnXG4nOwogICAgICAgIHN0ZDo6Y291dCA8PCB2W2UoKSAlIHYuc2l6ZSgpXSA8PCAnXG4nOwp9