#include <chrono>
#include <ctime>
#include <cstdint>
struct HighResClock
{
typedef long long rep;
typedef std::nano period;
typedef std::chrono::duration<rep, period> duration;
typedef std::chrono::time_point<HighResClock> time_point;
static const bool is_steady = true;
static time_point now();
};
template<class Clock>
class Timer
{
typedef Clock SysClock;
typedef typename Clock::time_point Time;
typedef typename Clock::duration Duration;
Time start_;
public:
Timer();
void Restart();
Duration TimeElapsed() const;
int64_t TimeElapsed_s() const;
int64_t TimeElapsed_ms() const;
int64_t TimeElapsed_us() const;
int64_t TimeElapsed_ns() const;
template<class unit>
int64_t TimeElapsed_T() const
{
return std::chrono::duration_cast<unit>(TimeElapsed()).count();
}
};
using NTimer = Timer<std::chrono::system_clock>;
using HRTimer = Timer<HighResClock>;
int main()
{
}
I2luY2x1ZGUgPGNocm9ubz4KCSNpbmNsdWRlIDxjdGltZT4KCSNpbmNsdWRlIDxjc3RkaW50PgogICAgc3RydWN0IEhpZ2hSZXNDbG9jawogICAgewogICAgICAgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcDsKICAgICAgICB0eXBlZGVmIHN0ZDo6bmFubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2Q7CiAgICAgICAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6ZHVyYXRpb248cmVwLCBwZXJpb2Q+ICAgICAgZHVyYXRpb247CiAgICAgICAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxIaWdoUmVzQ2xvY2s+ICAgdGltZV9wb2ludDsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zdGVhZHkgPSB0cnVlOwogICAgICAgIHN0YXRpYyB0aW1lX3BvaW50IG5vdygpOwogICAgfTsKIAogCXRlbXBsYXRlPGNsYXNzIENsb2NrPgogICAgY2xhc3MgVGltZXIKICAgIHsKICAgICAgICB0eXBlZGVmIENsb2NrIFN5c0Nsb2NrOwogICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQ2xvY2s6OnRpbWVfcG9pbnQgVGltZTsKICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIENsb2NrOjpkdXJhdGlvbiBEdXJhdGlvbjsKICAgICAgICBUaW1lIHN0YXJ0XzsKICAgIHB1YmxpYzoKICAgICAgICBUaW1lcigpOwogICAgICAgIHZvaWQgUmVzdGFydCgpOwogCiAgICAgICAgRHVyYXRpb24gVGltZUVsYXBzZWQoKSBjb25zdDsKICAgICAgICBpbnQ2NF90IFRpbWVFbGFwc2VkX3MoKSBjb25zdDsKICAgICAgICBpbnQ2NF90IFRpbWVFbGFwc2VkX21zKCkgY29uc3Q7CiAgICAgICAgaW50NjRfdCBUaW1lRWxhcHNlZF91cygpIGNvbnN0OwogICAgICAgIGludDY0X3QgVGltZUVsYXBzZWRfbnMoKSBjb25zdDsKIAogICAgICAgIHRlbXBsYXRlPGNsYXNzIHVuaXQ+CiAgICAgICAgaW50NjRfdCBUaW1lRWxhcHNlZF9UKCkgY29uc3QKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDx1bml0PihUaW1lRWxhcHNlZCgpKS5jb3VudCgpOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIHVzaW5nIE5UaW1lciA9IFRpbWVyPHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+OwogICAgdXNpbmcgSFJUaW1lciA9IFRpbWVyPEhpZ2hSZXNDbG9jaz47CgppbnQgbWFpbigpCnsKCn0KIAogICAg