<p>There is a special kind of apple tree that grows apples every day for <code>n</code> days. On the <code>i<sup>th</sup></code> day, the tree grows <code>apples[i]</code> apples that will rot after <code>days[i]</code> days, that is on day <code>i + days[i]</code> the apples will be rotten and cannot be eaten. On some days, the apple tree does not grow any apples, which are denoted by <code>apples[i] == 0</code> and <code>days[i] == 0</code>.</p>

<p>You decided to eat <strong>at most</strong> one apple a day (to keep the doctors away). Note that you can keep eating after the first <code>n</code> days.</p>

<p>Given two integer arrays <code>days</code> and <code>apples</code> of length <code>n</code>, return <em>the maximum number of apples you can eat.</em></p>

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

<pre>
<strong>Input:</strong> apples = [1,2,3,5,2], days = [3,2,1,4,2]
<strong>Output:</strong> 7
<strong>Explanation:</strong> You can eat 7 apples:
- On the first day, you eat an apple that grew on the first day.
- On the second day, you eat an apple that grew on the second day.
- On the third day, you eat an apple that grew on the second day. After this day, the apples that grew on the third day rot.
- On the fourth to the seventh days, you eat apples that grew on the fourth day.
</pre>

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

<pre>
<strong>Input:</strong> apples = [3,0,0,0,0,2], days = [3,0,0,0,0,2]
<strong>Output:</strong> 5
<strong>Explanation:</strong> You can eat 5 apples:
- On the first to the third day you eat apples that grew on the first day.
- Do nothing on the fouth and fifth days.
- On the sixth and seventh days you eat apples that grew on the sixth day.
</pre>

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

<ul>
	<li><code>n == apples.length == days.length</code></li>
	<li><code>1 &lt;= n &lt;= 2 * 10<sup>4</sup></code></li>
	<li><code>0 &lt;= apples[i], days[i] &lt;= 2 * 10<sup>4</sup></code></li>
	<li><code>days[i] = 0</code> if and only if <code>apples[i] = 0</code>.</li>
</ul>

'''
growd apples every day for n days
on the ith day it grows apples[i] apples
the apples from day i will rot on days[i]

you need to eat as mayn apples as possible but can only do 1 a day
greedy approach?
we always want to eat the apple that is the closest to rotting
can use a heap with days, numApples
but we would need to do a lot of math but it is def doable
keep track of current day
we will eat apples closest to expiry and add the next apple set n times
after that we can start doing shortcut math

have a heap
for i:
    add dayOfExpiry, numApples to heap
    pop from heap till we get unrotten apples
    
    if can eat 1 
        increment count
        put it back in heap

now we are going above len(apples) days which means no new apples are growing 
pop from heap
increment count and day by max(0, min(daysOfExpiry - day, NumApples))

return count
'''
class Solution:
    def eatenApples(self, apples: List[int], days: List[int]) -> int:
        heap = []
        res = 0
        for day in range(1, len(apples) + 1):
            grown = apples[day - 1]
            dayToExpire = day + days[day - 1]

            if grown:
                heappush(heap, (dayToExpire, grown))

            while heap:
                expiryDay, apps = heappop(heap)

                if day < expiryDay:
                    res += 1
                    apps -= 1
                    if apps > 0:
                        heappush(heap, (expiryDay, apps))

                    break

        day = len(apples) + 1
        while heap:
            expiryDay, apps = heappop(heap)

            if day < expiryDay:
                edibleApples = min(expiryDay - day, apps)
                res += edibleApples
                day += edibleApples

        return res
490