- #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==