Олимпиадный тренинг

Задача . F. Сдвигаем ящики


Задана бесконечная клеточная полоса. На ней расположены \(n\) ящиков: \(i\)-й ящик находится в клетке \(a_i\) и имеет вес \(w_i\). Все \(a_i\) различны; также, \(a_{i - 1} < a_i\) для всех корректных \(i\).

Вы решили собрать вместе некоторые ящики. «Собрать вместе» ящики с номерами в отрезке \([l, r]\) означает, что вам необходимо их расположить таким образом, что их позиции образуют некоторый отрезок \([x, x + (r - l)]\).

За один шаг вы можете сдвинуть любой ящик в соседнюю клетку, если она не занята другим ящиком (т. е. выбрать \(i\) и изменить \(a_i\) на \(1\), при этом все позиции должны остаться различными). На передвижение ящика \(i\) на одну клетку вы тратите энергию, равную его весу \(w_i\). Вы можете двигать ящики в любом порядке любое количество раз.

Веса некоторых ящиков иногда изменяются, поэтому Вам необходимо обработать запросы двух видов:

  1. \(id\) \(nw\) — вес \(w_{id}\) ящика \(id\) становится равным \(nw\).
  2. \(l\) \(r\) — вы должны вычислить минимальную суммарную энергию, необходимую для того, чтобы собрать вместе ящики с номерами в отрезке \([l, r]\). Так как ответ может быть слишком большим, выведите остаток от деления ответа на \(1000\,000\,007 = 10^9 + 7\). Обратите внимание, при таком запросе ящики остаются на местах, вам нужно лишь вычислить ответ.

Обратите внимание, что минимизировать надо сам ответ, а не его остаток от деления на \(10^9 + 7\). Например, если у вас два возможных ответа — \(2 \cdot 10^9 + 13\) и \(2 \cdot 10^9 + 14\) — то необходимо выбрать первый ответ и вывести \(10^9 + 6\), даже с учетом того, что второй ответ дает остаток \(0\).

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

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — количество ящиков и запросов.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots a_n\) (\(1 \le a_i \le 10^9\)) — позиции ящиков. Все \(a_i\) различны, \(a_{i - 1} < a_i\) для всех корректных \(i\).

Третья строка содержит \(n\) целых чисел \(w_1, w_2, \dots w_n\) (\(1 \le w_i \le 10^9\)) — начальные веса ящиков.

Следующие \(q\) строк содержат запросы, по одному запросу в строке.

Каждый запрос описывается одной строкой, содержащей два целых числа \(x\) и \(y\). Если \(x < 0\), то это запрос первого типа, причем \(id = -x\), \(nw = y\) (\(1 \le id \le n\), \(1 \le nw \le 10^9\)). Если же \(x > 0\), то это запрос второго типа, причем \(l = x\), а \(r = y\) (\(1 \le l_j \le r_j \le n\)). Число \(x\) не может быть равно \(0\).

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

Для каждого запроса второго типа выведите ответ на него в отдельной строке. Так как ответ может быть слишком большим, выведите остаток от деления его на \(1000\,000\,007 = 10^9 + 7\).

Примечание

Рассмотрим запросы из примера:

  1. \(1\ 1\): ящик только один, поэтому двигать его не надо.
  2. \(1\ 5\): мы можем сдвинуть ящики в отрезок \([4, 8]\): \(1 \cdot |1 - 4| + 1 \cdot |2 - 5| + 1 \cdot |6 - 6| + 1 \cdot |7 - 7| + 2 \cdot |10 - 8| = 10\).
  3. \(1\ 3\): мы можем сдвинуть ящики в отрезок \([1, 3]\).
  4. \(3\ 5\): мы можем сдвинуть ящики в отрезок \([7, 9]\).
  5. \(-3\ 5\): изменение \(w_3\) из \(1\) в \(5\).
  6. \(-1\ 10\): изменение \(w_1\) из \(1\) в \(10\). Теперь веса ящиков равны \(w = [10, 1, 5, 1, 2]\).
  7. \(1\ 4\): мы можем сдвинуть ящики в отрезок \([1, 4]\).
  8. \(2\ 5\): мы можем сдвинуть ящики в отрезок \([5, 8]\).

Примеры
Входные данныеВыходные данные
1 5 8
1 2 6 7 10
1 1 1 1 2
1 1
1 5
1 3
3 5
-3 5
-1 10
1 4
2 5
0
10
3
4
18
7

time 2500 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
Комментарий учителя