コード:
#include <iostream>
#include <map>
#include <utility>
template <typename Key0, typename Key1, typename Value0, typename Value1>
inline bool Intersect(const std::pair<Key0, Value0>& range0, const std::pair<Key1, Value1>& range1)
{
// must be range0.first <= range1.first
return range1.first <= range0.second + 1;
}
template <typename Key0, typename Key1, typename Value0, typename Value1>
inline bool Enclose(const std::pair<Key0, Value0>& range0, const std::pair<Key1, Value1>& range1)
{
// must be range0.first <= range1.first
return range1.second <= range0.second;
}
template <typename Key, typename Value>
std::pair<Key, Value> MergeAndErase(std::map<Key, Value>& ranges, std::pair<Key, Value> range,
const typename std::map<Key, Value>::iterator& next)
{
auto it = next;
while (it != ranges.end() && Enclose(range, *it))
{
it = ranges.erase(it);
}
if (it != ranges.end() && Intersect(range, *it))
{
range.second = it->second;
it = ranges.erase(it);
}
return range;
}
template <typename Key, typename Value>
void InsertOrMerge(std::map<Key, Value>& ranges, std::pair<Key, Value> range,
const typename std::map<Key, Value>::iterator& next)
{
range = MergeAndErase(ranges, range, next);
ranges.insert(range);
}
template <typename Key, typename Value>
void InsertOrMerge(std::map<Key, Value>& ranges, std::pair<Key, Value> range,
const typename std::map<Key, Value>::iterator& prev, const typename std::map<Key, Value>::iterator& next)
{
if (Intersect(*prev, range))
{
range = MergeAndErase(ranges, range, next);
if (prev->second < range.second)
{
prev->second = range.second;
}
}
else
{
InsertOrMerge(ranges, range, next);
}
}
template <typename Key, typename Value>
void InsertOrMerge(std::map<Key, Value>& ranges, const std::pair<Key, Value>& range)
{
if (ranges.empty())
{
ranges.insert(range);
}
else
{
auto next = ranges.lower_bound(range.first);
if (next != ranges.begin())
{
auto prev = next;
--prev;
InsertOrMerge(ranges, range, prev, next);
}
else
{
InsertOrMerge(ranges, range, next);
}
}
}
int main()
{
using namespace std;
typedef long IntType;
map<IntType, IntType> ranges;
size_t numdata = 0;
cin >> numdata;
IntType a = 0, b = 0;
for (size_t i = 0; i < numdata; ++i)
{
cin >> a >> b;
InsertOrMerge(ranges, make_pair(a, b));
}
for (auto it = ranges.begin(); it != ranges.end(); ++it)
{
cout << it->first << " " << it->second << endl;
}
}