<p>You are given an array of <code>events</code> where <code>events[i] = [startDay<sub>i</sub>, endDay<sub>i</sub>]</code>. Every event <code>i</code> starts at <code>startDay<sub>i</sub></code><sub> </sub>and ends at <code>endDay<sub>i</sub></code>.</p>

<p>You can attend an event <code>i</code> at any day <code>d</code> where <code>startTime<sub>i</sub> &lt;= d &lt;= endTime<sub>i</sub></code>. You can only attend one event at any time <code>d</code>.</p>

<p>Return <em>the maximum number of events you can attend</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2020/02/05/e1.png" style="width: 400px; height: 267px;" />
<pre>
<strong>Input:</strong> events = [[1,2],[2,3],[3,4]]
<strong>Output:</strong> 3
<strong>Explanation:</strong> You can attend all the three events.
One way to attend them all is as shown.
Attend the first event on day 1.
Attend the second event on day 2.
Attend the third event on day 3.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> events= [[1,2],[2,3],[3,4],[1,2]]
<strong>Output:</strong> 4
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= events.length &lt;= 10<sup>5</sup></code></li>
	<li><code>events[i].length == 2</code></li>
	<li><code>1 &lt;= startDay<sub>i</sub> &lt;= endDay<sub>i</sub> &lt;= 10<sup>5</sup></code></li>
</ul>

import heapq
from typing import List

class Solution:
    def maxEvents(self, events: List[List[int]]) -> int:
        # Sort events by their start day
        events.sort(key=lambda x: x[0])
        
        heap = []
        index = 0
        count = 0
        n = len(events)
        day = events[0][0]
        
        while index < n or heap:
            # Push all events that start on the current day into the heap
            while index < n and events[index][0] == day:
                heapq.heappush(heap, events[index][1])  # Push the end day only
                index += 1
            
            # Remove expired events from the heap
            while heap and heap[0] < day:
                heapq.heappop(heap)
            
            # Attend the event that ends the earliest
            if heap:
                heapq.heappop(heap)
                count += 1
            
            # Move to the next day
            day += 1
            
            # If there are no events left in the heap and the current day is less than the next event's start day
            if not heap and index < n:
                day = events[index][0]
        
        return count

62600