Есть одна неинтересная задача, которую мне вроде как удалось решить (условия снизу, код в конце).
Складывай и умножай.
Ограничение времени
2 секунды
Ограничение памяти 64Mb
Ввод
стандартный ввод или input.txt
Вывод
стандартный вывод или output.txt
Вам даны два массива одинаковой длины A и B.
Вы должны выполнять 3 типа запросов:
“* l r x”: прибавить целое число x ко всем Ai, где l≤i≤r.
“. l r x”: прибавить целое число x ко всем Bi, где l≤i≤r.
“? l r”: вычислить сумму Al⋅Bl + … + Ar⋅Br.
Массивы пронумерованы, начиная с единицы. Изначально оба массива заполнены нулями.
Формат ввода
Первая строка входа содержит два целых числа n и m, разделённых пробелами — длина массивов и количество запросов, соответственно (1≤n,m≤100000).
Последующие m содержат запросы в формате, описанном в условии. Для каждого запроса 1≤l≤r≤n и 1≤x<10**9+7.
Формат вывода
Для каждого запроса третьего типа выведите остаток от деления соответствующей суммы на 10**9 + 7.
Пример
Ввод:
5 4
* 1 4 10
. 2 5 8
? 1 3
? 2 5
Вывод:
160
240
Все вроде и ничего, но на одном из тестой выдает TL. Время работы - 2,081 с. вместо 2-х с..
Хотелось бы переделать программку так, чтобы этой ошибки не было. Код моего решения:
# Functions
def func_1(l,r,x,S):
for i in range(l-1,r):
S[i] += x
return S
def func_2(l,r,A,B):
s = 0
for i in range(l-1,r):
s += A[i] * B[i]
return s % (10**9 + 7)
# End of functions
In_0 = list(map(int,input().split()))
L = In_0[0]
N = In_0[1]
A = [0] * L
B = [0] * L
for i in range(N):
In = list(input().split())
if In[0] == '*':
A = func_1(int(In[1]),int(In[2]),int(In[3]),A)
elif In[0] == '.':
B = func_1(int(In[1]),int(In[2]),int(In[3]),B)
elif In[0] == '?':
print(func_2(int(In[1]),int(In[2]),A,B))