<p>There are <code>n</code> different online courses numbered from <code>1</code> to <code>n</code>. You are given an array <code>courses</code> where <code>courses[i] = [duration<sub>i</sub>, lastDay<sub>i</sub>]</code> indicate that the <code>i<sup>th</sup></code> course should be taken <b>continuously</b> for <code>duration<sub>i</sub></code> days and must be finished before or on <code>lastDay<sub>i</sub></code>.</p>

<p>You will start on the <code>1<sup>st</sup></code> day and you cannot take two or more courses simultaneously.</p>

<p>Return <em>the maximum number of courses that you can take</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> courses = [[100,200],[200,1300],[1000,1250],[2000,3200]]
<strong>Output:</strong> 3
Explanation: 
There are totally 4 courses, but you can take 3 courses at most:
First, take the 1<sup>st</sup> course, it costs 100 days so you will finish it on the 100<sup>th</sup> day, and ready to take the next course on the 101<sup>st</sup> day.
Second, take the 3<sup>rd</sup> course, it costs 1000 days so you will finish it on the 1100<sup>th</sup> day, and ready to take the next course on the 1101<sup>st</sup> day. 
Third, take the 2<sup>nd</sup> course, it costs 200 days so you will finish it on the 1300<sup>th</sup> day. 
The 4<sup>th</sup> course cannot be taken now, since you will finish it on the 3300<sup>th</sup> day, which exceeds the closed date.
</pre>

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

<pre>
<strong>Input:</strong> courses = [[1,2]]
<strong>Output:</strong> 1
</pre>

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

<pre>
<strong>Input:</strong> courses = [[3,2],[4,3]]
<strong>Output:</strong> 0
</pre>

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

<ul>
	<li><code>1 &lt;= courses.length &lt;= 10<sup>4</sup></code></li>
	<li><code>1 &lt;= duration<sub>i</sub>, lastDay<sub>i</sub> &lt;= 10<sup>4</sup></code></li>
</ul>

class Solution:
    def scheduleCourse(self, courses: List[List[int]]) -> int:
        start=0
        hp=[]
        courses.sort(key=lambda x:x[1])#SORT COURSES BASED ON THE ENDTIME
        print(courses)          #START TAKING ALL THE COURSES ONE AT A TIME
        for d,end in courses:# 
            if start+d<=end:# IF THE CURRENT COURSE CAN BE COMPLETED WITH IN LASTTIME W.R.T PREVIOUS ONES THEN
                heapq.heappush(hp,[-d,end])#PUSH THE COURSE IN TO THE HEAP
                start=start+d# UPDATE THE TIME CONSUMED FOR ALL THE COURSES WITHIN HEAP AND PUSH THE -D VALUE TO ENSURE THAT LARGEST DURATION COURSE APPEARS AT THE BEGINNING OF THE HEAP I.E HP[0] BUT NOT AT THE TOP OR LAST SO WHENEVER A COURSES SMALLER THAT THE LARGEST COURSES IN THE HEAP COMES THEN IT REPLACES THAT COURSE WITH THE SMALLER ONE AND CONTINUES THE PROCESS TO GIVE THE MAX. NO.OF COURSES MEANWHILE WE UPDATE THE START OR TIME VALUE WITH START=START(ALREADY EXISTING)-LARGEST D VALUE IN HEAP+CURRENT ENCOUNTERED SMALL COURSE DURATION VALUE AND ...NOW PUSH THE CURRENT NEW VALUE INTO THE HEAP
            elif hp and -1*hp[0][0]>d:# 
                v=heapq.heappop(hp)#
                print("popped=",v)
                start=start+v[0]+d
                heapq.heappush(hp,[-d,end])
        # print(hp)
        return len(hp)
              
22600