class Solution {
public:
vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) {
vector<pair<int, int> > vertical_lines;
for (int i = 0; i < buildings.size(); ++i) {
vector<int> &building = buildings[i];
vertical_lines.push_back(make_pair(building[0], -building[2]));
vertical_lines.push_back(make_pair(building[1], building[2]));
}
sort(vertical_lines.begin(), vertical_lines.end());
multiset<int> mset;
vector<pair<int, int> > olist;
int lasty = 0;
for (int i = 0; i < vertical_lines.size(); ++i) {
int x = vertical_lines[i].first, y = vertical_lines[i].second;
if (y < 0) {
mset.insert(-y);
} else {
multiset<int>::iterator itr = mset.find(y);
mset.erase(itr);
}
int currenty = 0;
if (!mset.empty()) {
currenty = *mset.rbegin();
}
if (currenty != lasty) {
olist.push_back(make_pair(x, currenty));
lasty = currenty;
}
}
return olist;
}
};