class Solution {
public:
enum Type {
Start,
Finish,
};
struct Event {
int x;
Type type;
size_t index;
bool operator<(const Event& rhs) const {
return tie(x, type, index) < tie(rhs.x, rhs.type, rhs.index);
}
};
int findMinArrowShots(vector<vector<int>>& points) {
vector <Event>
events;
for (size_t i = 0; i < points.size(); ++i) {
events.push_back(Event{points[i][0], Start, i});
events.push_back(Event{points[i][1], Finish, i});
}
sort(events.begin(), events.end());
int result = 0;
vector <bool>
is_alive(points.size(), true);
vector <size_t>
current_open;
for (Event e : events) {
if (e.type == Start) {
current_open.push_back(e.index);
} else if (is_alive[e.index]) {
++result;
for (auto i : current_open) {
is_alive[i] = false;
}
current_open.clear();
}
}
return result;
}
};