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]