возможно ли сократить время выполнения программы в задаче lover bound

Здравствуйте помогите пожалуйста, потому что уже не знаю что делать

Задача выглядит так

Lower bound

На вход подаются N целых чисел, а также набор из M запросов, каждый из которых — целое число. Ваша задача — для каждого запроса найти количество чисел из исходного набора, меньших заданного в запросе числа. Использовать встроенные функции бинарного поиска запрещено.

n=int(input())
a = sorted(list(map(int, input().split())))
M = int(input())
b = list(map(int, input().split())) 
answers = list()
for i in range(M): #решал черезе бинарный поиск
    L = -1
    R = n
    while R - L > 1:
        M = (R + L) // 2
        if a[M] < b[i]:
            L = M
        else:
            R = M
    answers.append(R)
print(*answers)

все арботает отлично, но время выполнения большое

Входные данные

Первая строка содержит число N — количество элементов в массиве. 
1≤N≤250000.
Вторая строка содержит N целых чисел Ai через пробел. −109≤Ai≤109.
Третья строка содержит число M — количество запросов. 1≤M≤250000.
Четвёртая строка содержит M целых чисел Qi через пробел. −109≤Qi≤109.

Выходные данные

Выведите единственную строку с M целыми числами — количествами чисел 
исходного массива, меньших соответствующему запросу.

5
1 5 3 2 1
2
4 3

выход

4 3

Ответы (1 шт):

Автор решения: MBo

Можно попробовать так - отсортируйте запросы вместе с их номерами (список списков [число-запрос, исходный номер, ответ (пока неизвестный)])

Пройдите по списку по порядку, для увеличивающихся значений запроса получая увеличивающиеся ответы, записывайте их в третий элемент списков

Отсортируйте по второму полю, выведите ответы

O(nlogn)+O(mlogm)+O(n+m)+O(mlogm)

Теоретически это не лучше, т.к. ваше решение O(nlogn) + O(mlogn), где первое слагаемое доминирует, но а) сортировка всё-таки встроенная б) не расширяем список на каждом шагу

→ Ссылка