class Solution:
    def hIndex(self, A: List[int]) -> int:
        """ tc O(lgN) sc O(1)
        main idea: in order to maximum h-index, we need to use index instead of min,max value in citations 
        since values are sorted, we can get number of paper with citations bigger than h  with n - mid  
        """
        n = len(A)
        l,r = 0,n-1 #here set both l,r inclusive 
        while l <= r:
            mid = l + (r-l)//2 
            # count number of paper smaller than citations[mid]
            #h = A[mid] # X not min(mid+1,citations[mid])   
            if A[mid] == n - mid:  # n-mid: ammount of papers no more than mid, here mid == h  
                return A[mid]
            elif A[mid] > n - mid : #  citations[mid]  is too big         
                r = mid - 1 
                #print(f'move r, l is {l}, r is {r}' )
            else: # A[mid] < n - mid
                l = mid + 1
                #print(f'move l, l is {l}, r is {r}' )
        return n - l # can't use n-r or n - mid  because edge case [0]