#include <iostream>
#include <map>
#include <utility>
using namespace std;
// set<pair<int, int> > can also be used, but this way seems conceptually simpler
map<int, pair<int, int> > intervals;
void insert(int left, int right)
{
if (!intervals.empty())
{
// get the next bigger element
auto current = intervals.upper_bound(left);
// checking if not found is not needed because of decrement and how C++ iterators work
// decrement to get next smaller one instead, but only if we're not that the beginning
if (current != intervals.begin())
--current;
// skip current if it's entirely to the left of the new interval
if (current->second.second < left)
++current;
// update new starting point if there's an overlap and current is more to the left
if (current != intervals.end() && current->first <= right)
left = min(left, current->first);
// iterate through while there's an overlap (deleting as we go)
for (; current != intervals.end() && current->first <= right;
current = intervals.erase(current))
// update the end point of new interval
right = max(right, current->second.second);
}
// insert our pair
intervals[left] = make_pair(left, right);
}
int main() {
insert(1,2);
insert(4,8);
insert(3,10);
for (auto it: intervals)
cout << it.first << " " << it.second.second << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dXRpbGl0eT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIHNldDxwYWlyPGludCwgaW50PiA+IGNhbiBhbHNvIGJlIHVzZWQsIGJ1dCB0aGlzIHdheSBzZWVtcyBjb25jZXB0dWFsbHkgc2ltcGxlcgptYXA8aW50LCBwYWlyPGludCwgaW50PiA+IGludGVydmFsczsKCnZvaWQgaW5zZXJ0KGludCBsZWZ0LCBpbnQgcmlnaHQpCnsKCWlmICghaW50ZXJ2YWxzLmVtcHR5KCkpCgl7CgkJLy8gZ2V0IHRoZSBuZXh0IGJpZ2dlciBlbGVtZW50CgkJYXV0byBjdXJyZW50ID0gaW50ZXJ2YWxzLnVwcGVyX2JvdW5kKGxlZnQpOwoJCS8vIGNoZWNraW5nIGlmIG5vdCBmb3VuZCBpcyBub3QgbmVlZGVkIGJlY2F1c2Ugb2YgZGVjcmVtZW50IGFuZCBob3cgQysrIGl0ZXJhdG9ycyB3b3JrCgkJLy8gZGVjcmVtZW50IHRvIGdldCBuZXh0IHNtYWxsZXIgb25lIGluc3RlYWQsIGJ1dCBvbmx5IGlmIHdlJ3JlIG5vdCB0aGF0IHRoZSBiZWdpbm5pbmcKCQlpZiAoY3VycmVudCAhPSBpbnRlcnZhbHMuYmVnaW4oKSkKCQkJLS1jdXJyZW50OwoJCS8vIHNraXAgY3VycmVudCBpZiBpdCdzIGVudGlyZWx5IHRvIHRoZSBsZWZ0IG9mIHRoZSBuZXcgaW50ZXJ2YWwKCQlpZiAoY3VycmVudC0+c2Vjb25kLnNlY29uZCA8IGxlZnQpCgkJCSsrY3VycmVudDsKCQkvLyB1cGRhdGUgbmV3IHN0YXJ0aW5nIHBvaW50IGlmIHRoZXJlJ3MgYW4gb3ZlcmxhcCBhbmQgY3VycmVudCBpcyBtb3JlIHRvIHRoZSBsZWZ0CgkJaWYgKGN1cnJlbnQgIT0gaW50ZXJ2YWxzLmVuZCgpICYmIGN1cnJlbnQtPmZpcnN0IDw9IHJpZ2h0KQoJCQlsZWZ0ID0gbWluKGxlZnQsIGN1cnJlbnQtPmZpcnN0KTsKCQkvLyBpdGVyYXRlIHRocm91Z2ggd2hpbGUgdGhlcmUncyBhbiBvdmVybGFwIChkZWxldGluZyBhcyB3ZSBnbykKCQlmb3IgKDsgY3VycmVudCAhPSBpbnRlcnZhbHMuZW5kKCkgJiYgY3VycmVudC0+Zmlyc3QgPD0gcmlnaHQ7CgkJICAgICAgIGN1cnJlbnQgPSBpbnRlcnZhbHMuZXJhc2UoY3VycmVudCkpCgkJCS8vIHVwZGF0ZSB0aGUgZW5kIHBvaW50IG9mIG5ldyBpbnRlcnZhbAoJCQlyaWdodCA9IG1heChyaWdodCwgY3VycmVudC0+c2Vjb25kLnNlY29uZCk7Cgl9CgkvLyBpbnNlcnQgb3VyIHBhaXIKCWludGVydmFsc1tsZWZ0XSA9IG1ha2VfcGFpcihsZWZ0LCByaWdodCk7Cn0KCmludCBtYWluKCkgewoJaW5zZXJ0KDEsMik7CglpbnNlcnQoNCw4KTsKCWluc2VydCgzLDEwKTsKCWZvciAoYXV0byBpdDogaW50ZXJ2YWxzKQoJICAgIGNvdXQgPDwgaXQuZmlyc3QgPDwgIiAiIDw8IGl0LnNlY29uZC5zZWNvbmQgPDwgZW5kbDsKCXJldHVybiAwOwp9