#include <iostream>
#include <set>
#include <algorithm>
struct Vector3 {
int x, y, z;
};
struct Area {
Vector3 first;
Vector3 second;
inline bool inArea(Vector3 &vec) const
{
auto minX = std::min(first.x, second.x);
auto maxX = std::max(first.x, second.x);
auto minY = std::min(first.y, second.y);
auto maxY = std::max(first.y, second.y);
auto minZ = std::min(first.z, second.z);
auto maxZ = std::max(first.z, second.z);
auto &x = vec.x;
auto &y = vec.y;
auto &z = vec.z;
return x >= minX && x <= maxX && y >= minY && y <= maxY && z >= minZ && z <= maxZ;
}
inline bool operator<(Area const& rhs) const
{
return std::max(first.x, second.x) < std::max(rhs.first.x, rhs.second.x);
}
};
int debugCnt = 0;
std::set<Area> areas;
// std::map<int, std::set<Area>::iterator> myMap;
bool canPlaceBlock(Vector3 block)
{
for (auto it = areas.lower_bound({block, block}); it != areas.end() && std::min(it->first.x, it->second.x) <= block.x; ++it) {
++debugCnt;
if (it->inArea(block))
return false;
}
return true;
}
int main() {
// test code
for (int l = 0; l <= 10000; l++) {
int r = l + 100;
Vector3 first{l, l, l};
Vector3 second{r, r, r};
areas.insert({first, second});
}
std::cout << (canPlaceBlock({123, 456, 789}) ? "true" : "false") << '\n';
std::cout << debugCnt << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKc3RydWN0IFZlY3RvcjMgewoJaW50IHgsIHksIHo7Cn07CnN0cnVjdCBBcmVhIHsKCVZlY3RvcjMgZmlyc3Q7CglWZWN0b3IzIHNlY29uZDsKCWlubGluZSBib29sIGluQXJlYShWZWN0b3IzICZ2ZWMpIGNvbnN0Cgl7CgkJYXV0byBtaW5YID0gc3RkOjptaW4oZmlyc3QueCwgc2Vjb25kLngpOwoJCWF1dG8gbWF4WCA9IHN0ZDo6bWF4KGZpcnN0LngsIHNlY29uZC54KTsKCQlhdXRvIG1pblkgPSBzdGQ6Om1pbihmaXJzdC55LCBzZWNvbmQueSk7CgkJYXV0byBtYXhZID0gc3RkOjptYXgoZmlyc3QueSwgc2Vjb25kLnkpOwoJCWF1dG8gbWluWiA9IHN0ZDo6bWluKGZpcnN0LnosIHNlY29uZC56KTsKCQlhdXRvIG1heFogPSBzdGQ6Om1heChmaXJzdC56LCBzZWNvbmQueik7CgkJYXV0byAmeCA9IHZlYy54OwoJCWF1dG8gJnkgPSB2ZWMueTsKCQlhdXRvICZ6ID0gdmVjLno7CgoJCXJldHVybiB4ID49IG1pblggJiYgeCA8PSBtYXhYICYmIHkgPj0gbWluWSAmJiB5IDw9IG1heFkgJiYgeiA+PSBtaW5aICYmIHogPD0gbWF4WjsKCX0KCglpbmxpbmUgYm9vbCBvcGVyYXRvcjwoQXJlYSBjb25zdCYgcmhzKSBjb25zdAoJewoJCXJldHVybiBzdGQ6Om1heChmaXJzdC54LCBzZWNvbmQueCkgPCBzdGQ6Om1heChyaHMuZmlyc3QueCwgcmhzLnNlY29uZC54KTsKCX0KfTsKCmludCBkZWJ1Z0NudCA9IDA7CnN0ZDo6c2V0PEFyZWE+IGFyZWFzOwovLyBzdGQ6Om1hcDxpbnQsIHN0ZDo6c2V0PEFyZWE+OjppdGVyYXRvcj4gbXlNYXA7CmJvb2wgY2FuUGxhY2VCbG9jayhWZWN0b3IzIGJsb2NrKQp7Cglmb3IgKGF1dG8gaXQgPSBhcmVhcy5sb3dlcl9ib3VuZCh7YmxvY2ssIGJsb2NrfSk7IGl0ICE9IGFyZWFzLmVuZCgpICYmIHN0ZDo6bWluKGl0LT5maXJzdC54LCBpdC0+c2Vjb25kLngpIDw9IGJsb2NrLng7ICsraXQpIHsKCQkrK2RlYnVnQ250OwoJCWlmIChpdC0+aW5BcmVhKGJsb2NrKSkKCQkJcmV0dXJuIGZhbHNlOwoJfQoJcmV0dXJuIHRydWU7Cn0KCmludCBtYWluKCkgewoJLy8gdGVzdCBjb2RlCglmb3IgKGludCBsID0gMDsgbCA8PSAxMDAwMDsgbCsrKSB7CgkJaW50IHIgPSBsICsgMTAwOwoJCVZlY3RvcjMgZmlyc3R7bCwgbCwgbH07CgkJVmVjdG9yMyBzZWNvbmR7ciwgciwgcn07CgkJYXJlYXMuaW5zZXJ0KHtmaXJzdCwgc2Vjb25kfSk7Cgl9CglzdGQ6OmNvdXQgPDwgKGNhblBsYWNlQmxvY2soezEyMywgNDU2LCA3ODl9KSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICdcbic7CglzdGQ6OmNvdXQgPDwgZGVidWdDbnQgPDwgJ1xuJzsKCXJldHVybiAwOwp9