#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cassert>
#include <chrono>
class muTimer
{
using Clock = std::chrono::high_resolution_clock;
bool active = false;
Clock::duration duration_;
Clock::time_point start_ = Clock::now(), stop_ = Clock::now();
muTimer(const muTimer&) = delete;
muTimer& operator=(const muTimer&) = delete;
public:
using ns = std::chrono::nanoseconds;
using mks = std::chrono::microseconds;
using ms = std::chrono::milliseconds;
muTimer() { reset(); start(); }
~muTimer() = default;
muTimer& reset()
{
duration_ = std::chrono::nanoseconds(0);
active = false;
return *this;
}
muTimer& start()
{
if (!active)
{
start_ = Clock::now();
active = true;
}
return *this;
}
muTimer& stop()
{
if (active)
{
stop_ = Clock::now();
duration_ += stop_ - start_;
active = false;
}
return *this;
}
template<typename T = mks>
unsigned long long duration()
{
return static_cast<unsigned long long>
(std::chrono::duration_cast<T>(stop_-start_).count());
}
};
using namespace std;
int main()
{
const int N = 1000;
vector<int> y(N), z(N);
for(int i = 0; i < N; ++i)
y[i] = z[i] = rand()%200;
{
muTimer mt;
sort(y.begin(),y.end());
mt.stop();
cout << "Sorting : " << mt.duration<>() << " mks\n";
}
{
muTimer mt;
auto p = partition(z.begin(),z.end(),[](int x) { return x < 50; });
p = partition(p,z.end(),[](int x) { return x < 100; });
p = partition(p,z.end(),[](int x) { return x < 150; });
mt.stop();
cout << "Partition: " << mt.duration<>() << " mks\n";
}
cout << endl;
auto p1 = partition_point(y.begin(),y.end(),[](int x) { return x < 50; });
auto p2 = partition_point(z.begin(),z.end(),[](int x) { return x < 50; });
cout << p1 - y.begin() << " vs " << p2 - z.begin() << endl;
p1 = partition_point(y.begin(),y.end(),[](int x) { return x < 100; });
p2 = partition_point(z.begin(),z.end(),[](int x) { return x < 100; });
cout << p1 - y.begin() << " vs " << p2 - z.begin() << endl;
p1 = partition_point(y.begin(),y.end(),[](int x) { return x < 150; });
p2 = partition_point(z.begin(),z.end(),[](int x) { return x < 150; });
cout << p1 - y.begin() << " vs " << p2 - z.begin() << endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxjaHJvbm8+CgpjbGFzcyBtdVRpbWVyCnsKICAgIHVzaW5nIENsb2NrID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazsKICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CiAgICBDbG9jazo6ZHVyYXRpb24gICBkdXJhdGlvbl87CiAgICBDbG9jazo6dGltZV9wb2ludCBzdGFydF8gPSBDbG9jazo6bm93KCksIHN0b3BfID0gQ2xvY2s6Om5vdygpOwoKICAgIG11VGltZXIoY29uc3QgbXVUaW1lciYpICAgICAgICAgICAgID0gZGVsZXRlOwogICAgbXVUaW1lciYgb3BlcmF0b3I9KGNvbnN0IG11VGltZXImKSAgPSBkZWxldGU7CnB1YmxpYzoKICAgIHVzaW5nIG5zICAgICAgID0gc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzOwogICAgdXNpbmcgbWtzICAgICAgPSBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzOwogICAgdXNpbmcgbXMgICAgICAgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzOwogICAgbXVUaW1lcigpIHsgcmVzZXQoKTsgc3RhcnQoKTsgfQogICAgfm11VGltZXIoKSA9IGRlZmF1bHQ7CiAgICBtdVRpbWVyJiByZXNldCgpCiAgICB7CiAgICAgICAgZHVyYXRpb25fID0gc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKDApOwogICAgICAgIGFjdGl2ZSAgICA9IGZhbHNlOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIG11VGltZXImIHN0YXJ0KCkKICAgIHsKICAgICAgICBpZiAoIWFjdGl2ZSkKICAgICAgICB7CiAgICAgICAgICAgIHN0YXJ0XyA9IENsb2NrOjpub3coKTsKICAgICAgICAgICAgYWN0aXZlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgbXVUaW1lciYgc3RvcCgpCiAgICB7CiAgICAgICAgaWYgKGFjdGl2ZSkKICAgICAgICB7CiAgICAgICAgICAgIHN0b3BfICAgICAgPSBDbG9jazo6bm93KCk7CiAgICAgICAgICAgIGR1cmF0aW9uXyArPSBzdG9wXyAtIHN0YXJ0XzsKICAgICAgICAgICAgYWN0aXZlICAgICA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gbWtzPgogICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkdXJhdGlvbigpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4KICAgICAgICAgICAgKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PFQ+KHN0b3BfLXN0YXJ0XykuY291bnQoKSk7CiAgICB9Cn07Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmludCBtYWluKCkKewogICAgY29uc3QgaW50IE4gPSAxMDAwOwogICAgdmVjdG9yPGludD4geShOKSwgeihOKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOOyArK2kpCiAgICAgICAgeVtpXSA9IHpbaV0gPSByYW5kKCklMjAwOwoKICAgIHsKICAgICAgICBtdVRpbWVyIG10OwogICAgICAgIHNvcnQoeS5iZWdpbigpLHkuZW5kKCkpOwogICAgICAgIG10LnN0b3AoKTsKICAgICAgICBjb3V0IDw8ICJTb3J0aW5nICA6ICIgPDwgbXQuZHVyYXRpb248PigpIDw8ICIgbWtzXG4iOwogICAgfQogICAgewogICAgICAgIG11VGltZXIgbXQ7CiAgICAgICAgYXV0byBwID0gcGFydGl0aW9uKHouYmVnaW4oKSx6LmVuZCgpLFtdKGludCB4KSB7IHJldHVybiB4IDwgNTA7IH0pOwogICAgICAgIHAgPSBwYXJ0aXRpb24ocCx6LmVuZCgpLFtdKGludCB4KSB7IHJldHVybiB4IDwgMTAwOyB9KTsKICAgICAgICBwID0gcGFydGl0aW9uKHAsei5lbmQoKSxbXShpbnQgeCkgeyByZXR1cm4geCA8IDE1MDsgfSk7CiAgICAgICAgbXQuc3RvcCgpOwogICAgICAgIGNvdXQgPDwgIlBhcnRpdGlvbjogIiA8PCBtdC5kdXJhdGlvbjw+KCkgPDwgIiBta3NcbiI7CiAgICB9CgogICAgY291dCA8PCBlbmRsOwoKICAgIGF1dG8gcDEgPSBwYXJ0aXRpb25fcG9pbnQoeS5iZWdpbigpLHkuZW5kKCksW10oaW50IHgpIHsgcmV0dXJuIHggPCA1MDsgfSk7CiAgICBhdXRvIHAyID0gcGFydGl0aW9uX3BvaW50KHouYmVnaW4oKSx6LmVuZCgpLFtdKGludCB4KSB7IHJldHVybiB4IDwgNTA7IH0pOwoKICAgIGNvdXQgPDwgcDEgLSB5LmJlZ2luKCkgPDwgIiB2cyAiIDw8IHAyIC0gei5iZWdpbigpIDw8IGVuZGw7CgogICAgcDEgPSBwYXJ0aXRpb25fcG9pbnQoeS5iZWdpbigpLHkuZW5kKCksW10oaW50IHgpIHsgcmV0dXJuIHggPCAxMDA7IH0pOwogICAgcDIgPSBwYXJ0aXRpb25fcG9pbnQoei5iZWdpbigpLHouZW5kKCksW10oaW50IHgpIHsgcmV0dXJuIHggPCAxMDA7IH0pOwoKICAgIGNvdXQgPDwgcDEgLSB5LmJlZ2luKCkgPDwgIiB2cyAiIDw8IHAyIC0gei5iZWdpbigpIDw8IGVuZGw7CgogICAgcDEgPSBwYXJ0aXRpb25fcG9pbnQoeS5iZWdpbigpLHkuZW5kKCksW10oaW50IHgpIHsgcmV0dXJuIHggPCAxNTA7IH0pOwogICAgcDIgPSBwYXJ0aXRpb25fcG9pbnQoei5iZWdpbigpLHouZW5kKCksW10oaW50IHgpIHsgcmV0dXJuIHggPCAxNTA7IH0pOwoKICAgIGNvdXQgPDwgcDEgLSB5LmJlZ2luKCkgPDwgIiB2cyAiIDw8IHAyIC0gei5iZWdpbigpIDw8IGVuZGw7Cgp9Cg==