typedef long long LL;
const LL INF = 1e18;
typedef pair<LL, LL> PLL;
class SummaryRanges {
private:
set<PLL> intervals;
public:
SummaryRanges() {
intervals.insert({-INF, -INF});
intervals.insert({INF, INF});
}
void addNum(int val) {
// 找到 l1 最小的且满足 l1 > val 的区间 interval1 = [l1, r1]
auto l1 = intervals.upper_bound({val, INF});
auto l0 = l1;
--l0;
if (l0->second >= val) return; // 点val在区间interval中
else if (l0->second + 1 == val && l1->first - 1 == val) {
intervals.insert({l0->first, l1->second});
intervals.erase(l0);
intervals.erase(l1);
} else if (l0->second + 1 == val) {
intervals.insert({l0->first, val});
intervals.erase(l0);
} else if (l1->first - 1 == val) {
intervals.insert({val, l1->second});
intervals.erase(l1);
} else {
intervals.insert({val, val});
}
}
vector<vector<int>> getIntervals() {
vector<vector<int>> res;
for (auto& [l, r] : intervals) {
if (l != -INF && r != INF) {
res.push_back({(int)l, (int)r});
}
}
return res;
}
};
/**
* Your SummaryRanges object will be instantiated and called as such:
* SummaryRanges* obj = new SummaryRanges();
* obj->addNum(val);
* vector<vector<int>> param_2 = obj->getIntervals();
*/