아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

계산 최적화

시간 제한2초메모리 제한512 MB

요약
1e9+7로 나눈 덧셈과 곱셈 연산 열이 주어질 때, 최대 5e5번의 한 점 갱신을 처리하고 갱신할 때마다 전체 열을 계산한 결과를 출력한다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 행렬, 동적 계획법, 구현
정답자
아직 제출이 없습니다

문제

현욱은 덧셈과 곱셈을 계산할 수 있는 간단한 계산 장치를 만들었다. 이 계산 장치는 처음에 값 00에서 시작해서 NN(1≤N≤5⋅1051 \le N \le 5 \cdot 10^5)번의 연산을 순서대로 수행한 결과값을 반환한다. 연산은 아래의 두 종류가 있다.

  • + k : 이전 값에 kk를 더한다(1≤k≤1091 \le k \le 10^9)
  • * k : 이전 값에 kk를 곱한다(1≤k≤1091 \le k \le 10^9)

연산 결과값이 아주 커질 수 있기 때문에 이 계산 장치는 항상 계산 결과값을 109+710^9+7로 나눈 나머지를 저장한다.

현욱은 이 계산 장치에서 일부 연산을 변경한 후 계산 결과가 어떻게 달라지는지를 확인하고 싶다. 현욱은 총 QQ(1≤Q≤5⋅1051 \le Q \le 5 \cdot 10^5)번 계산 장치의 연산을 변경할 예정이며, 연산 변경은 다음과 같은 형태로 주어진다.

  • i + k : ii번째 연산을 이전 값에 kk를 더하는 연산으로 변경한다(1≤i≤N,1≤k≤1091 \le i \le N, 1 \le k \le 10^9).
  • i * k : ii번째 연산을 이전 값에 kk를 곱하는 연산으로 변경한다(1≤i≤N,1≤k≤1091 \le i \le N, 1 \le k \le 10^9).

모든 변경 사항은 누적된다.

현욱은 연산 변경이 하나 일어날 때마다 다시 처음부터 계산을 하는게 너무 비효율적이라고 생각한다. 현욱을 도와 현욱의 계산 장치를 최적화해서, 연산 변경이 일어날 때 결과를 빠르게 다시 계산하는 프로그램을 작성해보자.

입력

첫줄에 연산의 개수 NN과 연산을 변경할 횟수 QQ가 공백으로 구분되어 주어진다(1≤N,Q≤5⋅1051 \le N, Q \le 5 \cdot 10^5).

둘째 줄부터 NN줄에 걸쳐 맨 처음 계산 장치를 구성하는 NN개의 연산이 순서대로 주어진다.

그 다음부터 QQ줄에 걸쳐 계산 장치의 연산을 어떻게 변경했는지 정보가 순서대로 주어진다.

출력

QQ줄에 걸쳐 연산이 바뀔 때마다 계산 장치의 계산 결과값이 어떻게 바뀌는지 출력한다.

예제1

  1. 예제 1

    입력
    6 10
    + 3
    * 2
    + 2
    * 3
    + 4
    * 5
    1 + 2
    3 * 1
    4 * 5
    2 + 6
    2 * 2
    1 * 2
    3 * 1
    4 + 4
    1 + 5
    3 * 4
    
    예상 출력
    110
    80
    120
    220
    120
    20
    20
    40
    90
    240