Сложение, умножение, подстановочные запросы

Дан одномерный целочисленный массив A длины N. Нам нужно Q запросов каждого из следующих типов:

ПРИМЕЧАНИЕ. M фиксируется равным 10^9 + 7.

Запрос 1 : 1 x y v : Это означает добавление v ко всем элементам от x до y в 1 базовом индексированном массиве, а затем взять их по модулю M.

for (i = x; i <= y; i++)    
    A[i] += v;
    A[i] %= M; 

Запрос 2: 2 x y v: это означает умножение v на все элементы от x до y в 1 базовом индексированном массиве, а затем взять их по модулю M.

for (i = x; i <= y; i++)    
    A[i] *= v
    A[i] %= M

Запрос 3 : 3 x y v : Это означает замену v на все элементы от x до y в 1 базовом индексированном массиве.

for (i = x; i <= y; i++)    
    A[i] = v 

Запрос 4 : 4 x y : Это запрос отчета, который должен найти сумму значений в A от x до y, т. е.

sum = 0;
for (i = x; i <= y; i++)
    sum += A[i]
    sum %= M
Output sum.

Теперь, как обрабатывать эти запросы? Я знаю, как обрабатывать запросы, если это были запросы на добавление и суммирование с деревом сегментов. Но понятия не имею об этом. Пожалуйста, помогите мне решить эту проблему.

Ограничения: 1 ≤ N,Q ≤ 10^5 и 1 ≤ начальное значение A[i],v ≤ 10^9


person ms8    schedule 04.07.2015    source источник
comment
что значит как обращаться? У вас уже есть хороший псевдокод в вопросе. Что ты вообще здесь спрашиваешь?   -  person chiliNUT    schedule 04.07.2015
comment
в запросе 4: сумма %= M вы уверены, что хотите это... вы модифицируете свою сумму, а затем добавляете к ней...?   -  person jdl    schedule 04.07.2015
comment
@jdl Да.. Мне нужно сделать так   -  person ms8    schedule 04.07.2015
comment
@chiliNUT Я не могу сделать это, потому что количество таких запросов очень велико.   -  person ms8    schedule 04.07.2015
comment
@chiliNUT Пожалуйста, внимательно прочитайте задачу. Он принимает MOD на каждом шагу. Так что нет необходимости в такой библиотеке   -  person ms8    schedule 04.07.2015
comment
Ваши массивы из 10 000 не кажутся такими большими. В чем проблема того, что вы написали? Реализуйте это на c и посмотрите, есть ли проблема вообще. Материал также кажется приятно параллельным, BTW.   -  person Ami Tavory    schedule 04.07.2015
comment
@AmiTavory Предположим, у нас есть 10 ^ 5 элементов и 10 ^ 5 запросов, тогда каждый запрос в худшем случае будет выполняться за O (N), то есть 10 ^ 5. поэтому общая сложность становится 10 ^ 5 * 10 ^ 5, что недоступно   -  person ms8    schedule 04.07.2015
comment
Сейчас нет времени писать ответ, но вы можете использовать деревья сегментов/ленивое распространение/линейные полиномы над (**Z**/M)[x] при композиции.   -  person David Eisenstat    schedule 04.07.2015
comment
(Если вы редактируете вопрос по другой причине, исправьте заголовок.) См. Также Использование ленивого распространения для добавления и инициализации диапазона, умножения скаляр или отчет о текущей сумме.   -  person greybeard    schedule 05.07.2015
comment
@FalconUA Я знаю Фенвик Три. Но как это может быть решено ими? Не могли бы вы уточнить   -  person ms8    schedule 05.07.2015
comment
@greybeard Я знаю ленивое размножение. Но как это поможет здесь?   -  person ms8    schedule 05.07.2015