<p>You are given a <strong>0-indexed</strong> 2D integer array of <code>events</code> where <code>events[i] = [startTime<sub>i</sub>, endTime<sub>i</sub>, value<sub>i</sub>]</code>. The <code>i<sup>th</sup></code> event starts at <code>startTime<sub>i</sub></code><sub> </sub>and ends at <code>endTime<sub>i</sub></code>, and if you attend this event, you will receive a value of <code>value<sub>i</sub></code>. You can choose <strong>at most</strong> <strong>two</strong> <strong>non-overlapping</strong> events to attend such that the sum of their values is <strong>maximized</strong>.</p>

<p>Return <em>this <strong>maximum</strong> sum.</em></p>

<p>Note that the start time and end time is <strong>inclusive</strong>: that is, you cannot attend two events where one of them starts and the other ends at the same time. More specifically, if you attend an event with end time <code>t</code>, the next event must start at or after <code>t + 1</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/09/21/picture5.png" style="width: 400px; height: 75px;" />
<pre>
<strong>Input:</strong> events = [[1,3,2],[4,5,2],[2,4,3]]
<strong>Output:</strong> 4
<strong>Explanation: </strong>Choose the green events, 0 and 1 for a sum of 2 + 2 = 4.
</pre>

<p><strong class="example">Example 2:</strong></p>
<img alt="Example 1 Diagram" src="https://assets.leetcode.com/uploads/2021/09/21/picture1.png" style="width: 400px; height: 77px;" />
<pre>
<strong>Input:</strong> events = [[1,3,2],[4,5,2],[1,5,5]]
<strong>Output:</strong> 5
<strong>Explanation: </strong>Choose event 2 for a sum of 5.
</pre>

<p><strong class="example">Example 3:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/09/21/picture3.png" style="width: 400px; height: 66px;" />
<pre>
<strong>Input:</strong> events = [[1,5,3],[1,5,1],[6,6,5]]
<strong>Output:</strong> 8
<strong>Explanation: </strong>Choose events 0 and 2 for a sum of 3 + 5 = 8.</pre>

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

<ul>
	<li><code>2 &lt;= events.length &lt;= 10<sup>5</sup></code></li>
	<li><code>events[i].length == 3</code></li>
	<li><code>1 &lt;= startTime<sub>i</sub> &lt;= endTime<sub>i</sub> &lt;= 10<sup>9</sup></code></li>
	<li><code>1 &lt;= value<sub>i</sub> &lt;= 10<sup>6</sup></code></li>
</ul>

class Solution:

    def binarySearchMax(self, num, start, end, events, maxRightMap):
        

        while(start<end):
            # if(num == 72):
            #     print("argaergqreg", start, end)
            if(end-start == 1):
                if(num<events[start][0]):
                    return maxRightMap[events[start][0]]
                if(num<events[end][0]):
                    return maxRightMap[events[end][0]]
                return 0
            
            mid = (start+end)//2

            if(num >= events[mid][0]):
                start = mid+1
            elif(num < events[mid][0]):
                end = mid
        
        if(start == end and start<len(events)):
            if(num<events[start][0]):
                return maxRightMap[events[start][0]]
        
        return 0        

    def maxTwoEvents(self, events: List[List[int]]) -> int:

        events.sort()
        i = len(events)-1
        maxx = 0
        maxRightMap = {}
        rightMaxxxxx = 0
        # print(events)
        while(i>=0):

            rightMax = self.binarySearchMax(events[i][1], i+1,len(events)-1, events,maxRightMap)
            # print(events[i], i+1,len(events)-1, rightMax)
            # print(maxRightMap)
            # print()
            summ =  rightMax + events[i][2]
            # if(summ == 160):
            #     print("eqrgqrg", i)
            maxx = max(summ, maxx)
            rightMaxxxxx = max(rightMaxxxxx, events[i][2])
            maxRightMap[events[i][0]] = max(rightMaxxxxx, events[i][2])
            i-=1

        return maxx
1738