<p>You are given an array of <code>intervals</code>, where <code>intervals[i] = [start<sub>i</sub>, end<sub>i</sub>]</code> and each <code>start<sub>i</sub></code> is <strong>unique</strong>.</p>

<p>The <strong>right interval</strong> for an interval <code>i</code> is an interval <code>j</code> such that <code>start<sub>j</sub> &gt;= end<sub>i</sub></code> and <code>start<sub>j</sub></code> is <strong>minimized</strong>. Note that <code>i</code> may equal <code>j</code>.</p>

<p>Return <em>an array of <strong>right interval</strong> indices for each interval <code>i</code></em>. If no <strong>right interval</strong> exists for interval <code>i</code>, then put <code>-1</code> at index <code>i</code>.</p>

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

<pre>
<strong>Input:</strong> intervals = [[1,2]]
<strong>Output:</strong> [-1]
<strong>Explanation:</strong> There is only one interval in the collection, so it outputs -1.
</pre>

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

<pre>
<strong>Input:</strong> intervals = [[3,4],[2,3],[1,2]]
<strong>Output:</strong> [-1,0,1]
<strong>Explanation:</strong> There is no right interval for [3,4].
The right interval for [2,3] is [3,4] since start<sub>0</sub> = 3 is the smallest start that is &gt;= end<sub>1</sub> = 3.
The right interval for [1,2] is [2,3] since start<sub>1</sub> = 2 is the smallest start that is &gt;= end<sub>2</sub> = 2.
</pre>

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

<pre>
<strong>Input:</strong> intervals = [[1,4],[2,3],[3,4]]
<strong>Output:</strong> [-1,2,-1]
<strong>Explanation:</strong> There is no right interval for [1,4] and [3,4].
The right interval for [2,3] is [3,4] since start<sub>2</sub> = 3 is the smallest start that is &gt;= end<sub>1</sub> = 3.
</pre>

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

<ul>
	<li><code>1 &lt;= intervals.length &lt;= 2 * 10<sup>4</sup></code></li>
	<li><code>intervals[i].length == 2</code></li>
	<li><code>-10<sup>6</sup> &lt;= start<sub>i</sub> &lt;= end<sub>i</sub> &lt;= 10<sup>6</sup></code></li>
	<li>The start point of each interval is <strong>unique</strong>.</li>
</ul>

class Solution:
    def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
        sorted_intervals = sorted(intervals, key=lambda x: x[0])

        return_arr = []
        n = len(sorted_intervals)
        start_times = {}
        for i in range(n):
            start = intervals[i][0]
            if start not in start_times.keys():
                start_times[start] = i

        # print(start_times)
        sorted_start_times = dict(sorted(start_times.items()))

        for i in range(n):
            end = intervals[i][1]
            keys = list(sorted_start_times.keys())
            if end > max(keys):
                return_arr.append(-1)
            else:
                m = len(keys)
                front, back = 0, m-1
                final_key = None
                # print("current_end", end)
                while back >= front:
                    mid = (front+back)//2
                    curr_key = keys[mid]
                    # print("Front, back", front, back)
                    # print(mid, curr_key)
                    if curr_key > end:
                        if curr_key >= end:
                            final_key = curr_key
                        back = mid-1
                    elif curr_key < end:
                        if curr_key >= end:
                            final_key = curr_key
                        front = mid+1
                    else:
                        final_key = curr_key
                        break
                # print(final_key)
                return_arr.append(sorted_start_times[final_key])
                # for j in range(m):
                #     # print(keys)
                #     curr_key = keys[j]
                #     if curr_key >= end:
                #         return_arr.append(sorted_start_times[curr_key])
                #         break
        
        return return_arr
                    


        
22600