#include <iostream>
#include <utility>
template <class U, class V>
struct intersect_impl;
template <class U, class V>
bool intersect(const U& u, const V& v) {
return intersect_impl<U, V>::apply(u, v);
}
template<>
struct intersect_impl<std::pair<int, int>, int> {
static bool apply(const std::pair<int, int>& interval, int value) {
return interval.first <= value && value <= interval.second;
}
};
template<>
struct intersect_impl<std::pair<int, int>, std::pair<int, int>> {
static bool apply(const std::pair<int, int>& u, const std::pair<int, int>& v) {
return intersect(u, v.first) || intersect(u, v.second);
}
};
int main() {
std::cout << "[0, 2] ∩ 1 ? " << intersect(std::make_pair(0, 2), 1) << "\n";
std::cout << "[0, 2] ∩ 1 [3, 4] ? " << intersect(std::make_pair(0, 2), std::make_pair(3, 4)) << "\n";
std::cout << "[0, 2] ∩ 1 [1, 4] ? " << intersect(std::make_pair(0, 2), std::make_pair(1, 4)) << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlIDxjbGFzcyBVLCBjbGFzcyBWPgpzdHJ1Y3QgaW50ZXJzZWN0X2ltcGw7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MgVj4KYm9vbCBpbnRlcnNlY3QoY29uc3QgVSYgdSwgY29uc3QgViYgdikgewogICAgcmV0dXJuIGludGVyc2VjdF9pbXBsPFUsIFY+OjphcHBseSh1LCB2KTsKfQoKdGVtcGxhdGU8PgpzdHJ1Y3QgaW50ZXJzZWN0X2ltcGw8c3RkOjpwYWlyPGludCwgaW50PiwgaW50PiB7CiAgICBzdGF0aWMgYm9vbCBhcHBseShjb25zdCBzdGQ6OnBhaXI8aW50LCBpbnQ+JiBpbnRlcnZhbCwgaW50IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGludGVydmFsLmZpcnN0IDw9IHZhbHVlICYmIHZhbHVlIDw9IGludGVydmFsLnNlY29uZDsKICAgIH0KfTsKCnRlbXBsYXRlPD4Kc3RydWN0IGludGVyc2VjdF9pbXBsPHN0ZDo6cGFpcjxpbnQsIGludD4sIHN0ZDo6cGFpcjxpbnQsIGludD4+IHsKICAgIHN0YXRpYyBib29sIGFwcGx5KGNvbnN0IHN0ZDo6cGFpcjxpbnQsIGludD4mIHUsIGNvbnN0IHN0ZDo6cGFpcjxpbnQsIGludD4mIHYpIHsKICAgICAgICByZXR1cm4gaW50ZXJzZWN0KHUsIHYuZmlyc3QpIHx8IGludGVyc2VjdCh1LCB2LnNlY29uZCk7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIHN0ZDo6Y291dCA8PCAiWzAsIDJdIOKIqSAxID8gIiA8PCBpbnRlcnNlY3Qoc3RkOjptYWtlX3BhaXIoMCwgMiksIDEpIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgIlswLCAyXSDiiKkgMSBbMywgNF0gPyAiIDw8IGludGVyc2VjdChzdGQ6Om1ha2VfcGFpcigwLCAyKSwgc3RkOjptYWtlX3BhaXIoMywgNCkpIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgIlswLCAyXSDiiKkgMSBbMSwgNF0gPyAiIDw8IGludGVyc2VjdChzdGQ6Om1ha2VfcGFpcigwLCAyKSwgc3RkOjptYWtlX3BhaXIoMSwgNCkpIDw8ICJcbiI7CiAgICByZXR1cm4gMDsKfQ==