#include <cstdio>
#include <deque>
#include <algorithm>
#include <climits>
#include <sys/time.h>
using namespace std;
typedef unsigned int u32;
typedef unsigned long long u64;
static_assert(sizeof(u32)==4 && sizeof(u64)==8, "Fail");
struct A {
u32 first, second;
A(int f, int s):first(f),second(s) {}
bool operator<(u32 b) const { return first < b; }
};
//bool operator<(const A&a, u32 b) { return a.first < b; }
struct B {
u64 v;
B(int f, int s) { v = ((u64)f << 32) | s; }
bool operator<(u32 b) const {
return (v >> 32) < b;
}
};
u32 get_value(deque<A>& d, u32 v) {
auto p = lower_bound(d.begin(), d.end(), v);
if (p != d.end())
return p->second;
else
return UINT_MAX;
}
u32 get_value(deque<B>& d, u32 v) {
auto p = lower_bound(d.begin(), d.end(), v);
if (p != d.end())
return p->v & 0xFFFFFFFF;
else
return UINT_MAX;
}
int main(int argc, char **argv)
{
{
deque<A> d;
struct timeval s, e;
gettimeofday(&s, 0);
for (int i = 0; i < 1024LL * 1024 * 1024 * 3 / 32; ++i)
d.emplace_back(A(i, i ^ 92142));
long v = 0;
for (int i = 0; i < 10000; ++i)
v += get_value(d, i * 3 + 1);
gettimeofday(&e, 0);
auto sec = e.tv_sec - s.tv_sec;
auto usc = e.tv_usec - s.tv_usec;
printf("A %ld\n", v);
printf("Time: %lu\n", sec * 1000 + usc / 1000);
}
{
deque<B> d;
struct timeval s, e;
gettimeofday(&s, 0);
for (int i = 0; i < 1024LL * 1024 * 1024 * 3 / 32; ++i)
d.emplace_back(B(i, i ^ 92142));
long v = 0;
for (int i = 0; i < 10000; ++i)
v += get_value(d, i * 3 + 1);
gettimeofday(&e, 0);
auto sec = e.tv_sec - s.tv_sec;
auto usc = e.tv_usec - s.tv_usec;
printf("B %ld\n", v);
printf("Time: %lu\n", sec * 1000 + usc / 1000);
}
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y2xpbWl0cz4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKc3RhdGljX2Fzc2VydChzaXplb2YodTMyKT09NCAmJiBzaXplb2YodTY0KT09OCwgIkZhaWwiKTsKCnN0cnVjdCBBIHsKCXUzMiBmaXJzdCwgc2Vjb25kOwoJQShpbnQgZiwgaW50IHMpOmZpcnN0KGYpLHNlY29uZChzKSB7fQoJYm9vbCBvcGVyYXRvcjwodTMyIGIpIGNvbnN0IHsgcmV0dXJuIGZpcnN0IDwgYjsgfQp9OwovL2Jvb2wgb3BlcmF0b3I8KGNvbnN0IEEmYSwgdTMyIGIpIHsgcmV0dXJuIGEuZmlyc3QgPCBiOyB9CgpzdHJ1Y3QgQiB7Cgl1NjQgdjsKCUIoaW50IGYsIGludCBzKSB7IHYgPSAoKHU2NClmIDw8IDMyKSB8IHM7IH0KCWJvb2wgb3BlcmF0b3I8KHUzMiBiKSBjb25zdCB7CgkJcmV0dXJuICh2ID4+IDMyKSA8IGI7Cgl9Cn07CnUzMiBnZXRfdmFsdWUoZGVxdWU8QT4mIGQsIHUzMiB2KSB7CglhdXRvIHAgPSBsb3dlcl9ib3VuZChkLmJlZ2luKCksIGQuZW5kKCksIHYpOwoJaWYgKHAgIT0gZC5lbmQoKSkKCQlyZXR1cm4gcC0+c2Vjb25kOwoJZWxzZQoJCXJldHVybiBVSU5UX01BWDsKfQp1MzIgZ2V0X3ZhbHVlKGRlcXVlPEI+JiBkLCB1MzIgdikgewoJYXV0byBwID0gbG93ZXJfYm91bmQoZC5iZWdpbigpLCBkLmVuZCgpLCB2KTsKCWlmIChwICE9IGQuZW5kKCkpCgkJcmV0dXJuIHAtPnYgJiAweEZGRkZGRkZGOwoJZWxzZQoJCXJldHVybiBVSU5UX01BWDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7Cgl7CgkJZGVxdWU8QT4gZDsKCQlzdHJ1Y3QgdGltZXZhbCBzLCBlOwoJCWdldHRpbWVvZmRheSgmcywgMCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0TEwgKiAxMDI0ICogMTAyNCAqIDMgLyAzMjsgKytpKQoJCQlkLmVtcGxhY2VfYmFjayhBKGksIGkgXiA5MjE0MikpOwoJCWxvbmcgdiA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgKytpKQoJCQl2ICs9IGdldF92YWx1ZShkLCBpICogMyArIDEpOwoJCQoJCWdldHRpbWVvZmRheSgmZSwgMCk7CgkJYXV0byBzZWMgPSBlLnR2X3NlYyAtIHMudHZfc2VjOwoJCWF1dG8gdXNjID0gZS50dl91c2VjIC0gcy50dl91c2VjOwoJCXByaW50ZigiQSAlbGRcbiIsIHYpOwoJCXByaW50ZigiVGltZTogJWx1XG4iLCBzZWMgKiAxMDAwICsgdXNjIC8gMTAwMCk7Cgl9Cgl7CgkJZGVxdWU8Qj4gZDsKCQlzdHJ1Y3QgdGltZXZhbCBzLCBlOwoJCWdldHRpbWVvZmRheSgmcywgMCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0TEwgKiAxMDI0ICogMTAyNCAqIDMgLyAzMjsgKytpKQoJCQlkLmVtcGxhY2VfYmFjayhCKGksIGkgXiA5MjE0MikpOwoJCWxvbmcgdiA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgKytpKQoJCQl2ICs9IGdldF92YWx1ZShkLCBpICogMyArIDEpOwoKCQlnZXR0aW1lb2ZkYXkoJmUsIDApOwoJCWF1dG8gc2VjID0gZS50dl9zZWMgLSBzLnR2X3NlYzsKCQlhdXRvIHVzYyA9IGUudHZfdXNlYyAtIHMudHZfdXNlYzsKCQlwcmludGYoIkIgJWxkXG4iLCB2KTsKCQlwcmludGYoIlRpbWU6ICVsdVxuIiwgc2VjICogMTAwMCArIHVzYyAvIDEwMDApOwoJfQp9Cg==