I have a similar idea here to also

store all existing overlaps so that we can check whether they intersect with the new event first (using solution from MyCalendar).
only scan events intersecting with the new events to update new overlaps.

Indeed, the worst case is O(N) and typically O(logN + k), where k is the number of events intersecting with the new event.