/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    vector<Interval> employeeFreeTime(vector<vector<Interval>>& schedule) {
        int len = schedule.size();
        vector<pair<int, int>> events;
        for(auto& v : schedule)
        {
            for(auto& i : v)
            {
                events.push_back(make_pair(i.start, 0));
                events.push_back(make_pair(i.end, 1));
            }
        }
        sort(events.begin(), events.end());
        vector<Interval> res;
        int count = 0, start = -1;
        for(auto& event : events)
        {
            if(event.second == 1)
            {
                --count;
                if(!count)start = event.first;
            }
            else
            {
                if(!count && start != -1)res.push_back(Interval(start, event.first));
                ++count;
            }
        }
        return res;
    }
};