<p>You are given a <strong>0-indexed</strong> 2D integer array <code>flowers</code>, where <code>flowers[i] = [start<sub>i</sub>, end<sub>i</sub>]</code> means the <code>i<sup>th</sup></code> flower will be in <strong>full bloom</strong> from <code>start<sub>i</sub></code> to <code>end<sub>i</sub></code> (<strong>inclusive</strong>). You are also given a <strong>0-indexed</strong> integer array <code>people</code> of size <code>n</code>, where <code>people[i]</code> is the time that the <code>i<sup>th</sup></code> person will arrive to see the flowers.</p>

<p>Return <em>an integer array </em><code>answer</code><em> of size </em><code>n</code><em>, where </em><code>answer[i]</code><em> is the <strong>number</strong> of flowers that are in full bloom when the </em><code>i<sup>th</sup></code><em> person arrives.</em></p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/03/02/ex1new.jpg" style="width: 550px; height: 216px;" />
<pre>
<strong>Input:</strong> flowers = [[1,6],[3,7],[9,12],[4,13]], people = [2,3,7,11]
<strong>Output:</strong> [1,2,2,2]
<strong>Explanation: </strong>The figure above shows the times when the flowers are in full bloom and when the people arrive.
For each person, we return the number of flowers in full bloom during their arrival.
</pre>

<p><strong class="example">Example 2:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/03/02/ex2new.jpg" style="width: 450px; height: 195px;" />
<pre>
<strong>Input:</strong> flowers = [[1,10],[3,3]], people = [3,3,2]
<strong>Output:</strong> [2,2,1]
<strong>Explanation:</strong> The figure above shows the times when the flowers are in full bloom and when the people arrive.
For each person, we return the number of flowers in full bloom during their arrival.
</pre>

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

<ul>
	<li><code>1 &lt;= flowers.length &lt;= 5 * 10<sup>4</sup></code></li>
	<li><code>flowers[i].length == 2</code></li>
	<li><code>1 &lt;= start<sub>i</sub> &lt;= end<sub>i</sub> &lt;= 10<sup>9</sup></code></li>
	<li><code>1 &lt;= people.length &lt;= 5 * 10<sup>4</sup></code></li>
	<li><code>1 &lt;= people[i] &lt;= 10<sup>9</sup></code></li>
</ul>

from bisect import bisect_right, bisect_left

class Solution:
    def fullBloomFlowers(self, flowers, people):
        # Sort flowers based on start times
        flowers.sort(key=lambda x: x[0])
        
        # Separate start and end times into two arrays
        start_times = [start for start, _ in flowers]
        end_times = sorted(end for _, end in flowers)
        
        # Sort people with their indices
        people_with_index = sorted((time, index) for index, time in enumerate(people))
        
        # Initialize the result array
        result = [0] * len(people)
        
        # Initialize the current flower index
        flower_index = 0
        
        # Iterate through people in sorted order
        for time, index in people_with_index:
            # Update the flower index to include flowers that start blooming before or at the current time
            while flower_index < len(flowers) and start_times[flower_index] <= time:
                flower_index += 1
            
            # Use binary search to find the number of flowers that have started blooming
            started = bisect_right(start_times, time)
            
            # Use binary search to find the number of flowers that have ended blooming
            ended = bisect_left(end_times, time)
            
            # Calculate the number of flowers in full bloom at the current time
            result[index] = started - ended
        
        return result

# Example usage:
solution = Solution()
flowers = [[1,6],[3,7],[9,12],[4,13]]
people = [2,3,7,11]
print(solution.fullBloomFlowers(flowers, people))  # Output: [1, 2, 2, 2]
888