#include <map>
#include <cassert>
#include <iostream>
template< typename T, typename U >
auto infimum(std::map<T,U> const& ctr, T query)
{
auto it = ctr.upper_bound(query);
return ctr.empty() || it == ctr.begin() ? ctr.cend() : --it;
}
template< typename T, typename U >
bool is_in_interval(std::map<T,U> const& ctr, T query)
{
auto inf = infimum(ctr, query);
return inf == ctr.end() ? false : query <= inf->second;
}
int main()
{
using std::cout;
using Map = std::map<int,int>;
Map intervals{{2,5}, {8,9}};
auto red = infimum(intervals, 4);
assert(red->first == 2);
cout << "red->first " << red->first << "\n";
auto green = infimum(intervals, 6);
assert(green->first == 2);
cout << "green->first " << green->first << "\n";
auto pink = infimum(intervals, 8);
assert(pink->first == 8);
cout << "pink->first " << pink->first << "\n";
auto yellow = infimum(intervals, 1);
assert(yellow == intervals.cend());
auto larger_than_all = infimum(intervals, 15);
assert(larger_than_all->first == 8);
bool red_is = is_in_interval(intervals, 4);
cout << "red is in " << red_is << "\n";
bool green_is = is_in_interval(intervals, 6);
cout << "green is in " << green_is << "\n";
bool pink_is = is_in_interval(intervals, 8);
cout << "pink is in " << pink_is << "\n";
bool yellow_is = is_in_interval(intervals, 1);
cout << "yellow is in " << yellow_is << "\n";
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlPCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVID4KYXV0byBpbmZpbXVtKHN0ZDo6bWFwPFQsVT4gY29uc3QmIGN0ciwgVCBxdWVyeSkKewoJYXV0byBpdCA9IGN0ci51cHBlcl9ib3VuZChxdWVyeSk7CiAgICByZXR1cm4gY3RyLmVtcHR5KCkgfHwgaXQgPT0gY3RyLmJlZ2luKCkgPyBjdHIuY2VuZCgpIDogLS1pdDsKfQoKdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUgPgpib29sIGlzX2luX2ludGVydmFsKHN0ZDo6bWFwPFQsVT4gY29uc3QmIGN0ciwgVCBxdWVyeSkKewogICAgYXV0byBpbmYgPSBpbmZpbXVtKGN0ciwgcXVlcnkpOwogICAgcmV0dXJuIGluZiA9PSBjdHIuZW5kKCkgPyBmYWxzZSA6IHF1ZXJ5IDw9IGluZi0+c2Vjb25kOwp9CgppbnQgbWFpbigpCnsKICAgIHVzaW5nIHN0ZDo6Y291dDsKICAgIHVzaW5nIE1hcCA9IHN0ZDo6bWFwPGludCxpbnQ+OwogICAgTWFwIGludGVydmFsc3t7Miw1fSwgezgsOX19OwoKICAgIGF1dG8gcmVkID0gaW5maW11bShpbnRlcnZhbHMsIDQpOwogICAgYXNzZXJ0KHJlZC0+Zmlyc3QgPT0gMik7CiAgICBjb3V0IDw8ICJyZWQtPmZpcnN0ICIgPDwgcmVkLT5maXJzdCA8PCAiXG4iOwoKICAgIGF1dG8gZ3JlZW4gPSBpbmZpbXVtKGludGVydmFscywgNik7CiAgICBhc3NlcnQoZ3JlZW4tPmZpcnN0ID09IDIpOwogICAgY291dCA8PCAiZ3JlZW4tPmZpcnN0ICIgPDwgZ3JlZW4tPmZpcnN0IDw8ICJcbiI7CgogICAgYXV0byBwaW5rID0gaW5maW11bShpbnRlcnZhbHMsIDgpOwogICAgYXNzZXJ0KHBpbmstPmZpcnN0ID09IDgpOwogICAgY291dCA8PCAicGluay0+Zmlyc3QgIiA8PCBwaW5rLT5maXJzdCA8PCAiXG4iOwoKICAgIGF1dG8geWVsbG93ID0gaW5maW11bShpbnRlcnZhbHMsIDEpOwogICAgYXNzZXJ0KHllbGxvdyA9PSBpbnRlcnZhbHMuY2VuZCgpKTsKCiAgICBhdXRvIGxhcmdlcl90aGFuX2FsbCA9IGluZmltdW0oaW50ZXJ2YWxzLCAxNSk7CiAgICBhc3NlcnQobGFyZ2VyX3RoYW5fYWxsLT5maXJzdCA9PSA4KTsKCiAgICBib29sIHJlZF9pcyA9IGlzX2luX2ludGVydmFsKGludGVydmFscywgNCk7CiAgICBjb3V0IDw8ICJyZWQgaXMgaW4gIiA8PCByZWRfaXMgPDwgIlxuIjsKCiAgICBib29sIGdyZWVuX2lzID0gaXNfaW5faW50ZXJ2YWwoaW50ZXJ2YWxzLCA2KTsKICAgIGNvdXQgPDwgImdyZWVuIGlzIGluICIgPDwgZ3JlZW5faXMgPDwgIlxuIjsKCiAgICBib29sIHBpbmtfaXMgPSBpc19pbl9pbnRlcnZhbChpbnRlcnZhbHMsIDgpOwogICAgY291dCA8PCAicGluayBpcyBpbiAiIDw8IHBpbmtfaXMgPDwgIlxuIjsKCiAgICBib29sIHllbGxvd19pcyA9IGlzX2luX2ludGVydmFsKGludGVydmFscywgMSk7CiAgICBjb3V0IDw8ICJ5ZWxsb3cgaXMgaW4gIiA8PCB5ZWxsb3dfaXMgPDwgIlxuIjsKfQ==