input: Write a python function to schedule jobs to maximize profit. 
  assert jobScheduling([(1, 2, 50), (3, 5, 20), (6, 19, 100), (2, 100, 200)]) == 250
  assert jobScheduling([(1, 3, 20), (2, 5, 20), (3, 10, 100), (4, 6, 70), (6, 9, 60)]) == 150
  assert jobScheduling([(1, 2, 50), (2, 3, 10), (3, 5, 20), (4, 6, 30), (5, 8, 15), (7, 9, 25)]) == 95
output: def jobScheduling(jobs):
      jobs.sort(key=lambda x: x[1])
      n = len(jobs)
      dp = [0] * n
      dp[0] = jobs[0][2]
  
      for i in range(1, n):
          incl_prof = jobs[i][2]
          l = binarySearch(jobs, i)
          if l != -1:
              incl_prof += dp[l]
          dp[i] = max(incl_prof, dp[i-1])
  
      return dp[-1]
  
  def binarySearch(jobs, index):
      low, high = 0, index - 1
      while low <= high:
          mid = (low + high) // 2
          if jobs[mid][1] <= jobs[index][0]:
              if jobs[mid + 1][1] <= jobs[index][0]:
                  low = mid + 1
              else:
                  return mid
          else:
              high = mid - 1
      return -1