eolymp
bolt
Спробуйте наш новий інтерфейс для відправки розв'язків
Задачі

Range Sum Query

Range Sum Query

Задано массив цілих чисел, спочатку заповнений нулями. Над ним необхідно виконувати два типи операцій:

  • ! i x - присвоїти комірці i значення x;
  • ? l r - взнати суму значень на відрізку [l, r].

Вхідні дані

Перший рядок містить розмір масиву n та кількість запитів m (1n ≤ (109 + 7), 1m2 * 105). За ним йде m запитів по одному у рядку.

У процесі роботи програми необхідно підтримувати два числа P і Q. Спочатку P = 91, Q = 47.

Запит виду "**! A B**" означає, що у комірку (A + P) mod n необхідно записати число (B + Q) mod (109 + 7).

Запит виду "**? A B**" означає, що необхіно порахувати суму між елементами (A + P) mod n, (B + Q) mod n включно. Нехай відповідь дорівнює Z. Тоді необхідно змінити числа P і Q наступним чином:

P = (P * 31) + Z mod (109 + 7),

Q = (Q * 29) + Z mod (109 + 7).

Нумерація елементів починається з нуля.

Усі вхідні числа не перевищують 109 + 7.

Вихідні дані

Для кождого запиту про суму потрібно вивести відповідь на нього у окремому рядку.

Ліміт часу 1 секунда
Ліміт використання пам'яті 256 MiB
Вхідні дані #1
10 8
! 1 4
! 2 5
? 3 6
! 4 1
? 5 9
! 1 4
? 5 9
? 5 9
Вихідні дані #1
52
1416
42558
103
Вхідні дані #2
15 6
! 1 1
! 5 2
? 5 14
! 8 7
? 1 4
? 4 13
Вихідні дані #2
97
0
0