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

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

계산 실수

시간 제한3초메모리 제한256 MB

요약
숫자와 +, - 기호로 이루어진 문자열에서 구간을 교체하고, 주어진 구간을 계산기의 규칙대로 계산한 값을 구한다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 문자열, 수학
정답자
아직 제출이 없습니다

문제

수찬이는 덧셈과 뺄셈만 하는 계산기를 쓴다. 계산기에는 숫자 버튼 0부터 9까지, 연산 기호 버튼 +와 -, 결과를 보여주는 = 버튼, 계산기 상태를 처음으로 되돌리는 AC 버튼이 있다. 입력하고 있는 수만 지우는 C 버튼은 없다.

수식을 순서대로 입력하고 = 버튼을 누르면 화면에 계산 결과가 나온다. 다룰 수 있는 수의 범위에는 제한이 없고, 0으로 시작하는 수를 입력해도 된다. 연산 기호를 잘못 눌러 계산이 틀어지는 일을 막으려고 계산기는 세 가지 규칙을 따른다.

  1. 연산 기호가 연속해서 나오면 가장 나중에 나온 것만 취한다.
  2. 수식이 연산 기호로 시작하면 그 앞에 0을 붙였다고 본다.
  3. 수식이 연산 기호로 끝나면 그 기호를 무시한다.

예를 들어 -15+0035-+-3-을 차례로 누른 뒤 =를 누르면 계산기는 0−15+35−30 - 15 + 35 - 3을 계산해 17을 보여준다. - 하나만 누르고 =를 누르면 수식이 0−0-이 되었다가 마지막 -가 무시되어 결과는 0이다.

C 버튼이 없으니 숫자 하나를 잘못 눌러도 AC를 누르고 수식을 처음부터 다시 입력해야 한다. 수찬이는 이 불편을 없애려고 다음 자료구조를 만들기로 했다.

0부터 9, +, -로만 이루어진 길이 NN인 문자열 SS가 있다. 문자열 XX와 1≤i≤j≤∣X∣1 \le i \le j \le |X|에 대해, X[i..j]X[i..j]는 XX의 ii번째 문자부터 jj번째 문자까지를 이어 붙인 부분문자열이다.

아래 두 연산을 지원하는 자료구조를 구현하라.

  1. 바꾸기: S[a..b]S[a..b]를 길이가 b−a+1b - a + 1인 새 문자열 TT로 바꾼다. 즉 a≤i≤ba \le i \le b인 모든 ii에 대해 S[i]S[i]를 T[i−a+1]T[i - a + 1]로 바꾼다.
  2. 계산하기: AC 버튼을 누른 뒤 S[a..b]S[a..b]를 계산기에 입력하고 = 버튼을 눌렀을 때 화면에 나오는 값을 구한다.

입력

첫째 줄에 문자열의 길이 NN (1≤N≤200 0001 \le N \le 200\,000)이 주어진다.

둘째 줄에 문자열 SS가 주어진다. SS의 길이는 NN이다.

셋째 줄에 질의의 수 QQ (1≤Q≤300 0001 \le Q \le 300\,000)가 주어진다.

다음 QQ개의 줄에 연산이 한 줄에 하나씩 주어진다. 각 줄의 형식은 아래와 같다.

  • 바꾸기 연산은 1 a b T 형식이다. aa와 bb는 1≤a≤b≤N1 \le a \le b \le N을 만족하는 정수이고, TT는 길이가 b−a+1b - a + 1인 문자열이다. 모든 바꾸기 연산에서 주어지는 TT의 길이의 합은 200 000200\,000 이하이다.
  • 계산하기 연산은 2 a b 형식이다. aa와 bb는 1≤a≤b≤N1 \le a \le b \le N을 만족하는 정수이다. 계산하기 연산은 적어도 하나 주어진다.

입력으로 주어지는 문자열은 모두 0부터 9, +, -로만 이루어져 있다.

출력

계산하기 연산이 주어질 때마다 계산 결과를 109+710^9 + 7로 나눈 나머지를 한 줄에 하나씩 출력한다. 정수 xx를 109+710^9 + 7로 나눈 나머지는, 정수 qq와 rr가 x=q(109+7)+rx = q(10^9 + 7) + r와 0≤r<109+70 \le r < 10^9 + 7을 만족할 때의 rr의 값이다.

예제1

  1. 예제 1

    입력
    10
    153+0174-1
    8
    2 1 10
    2 3 9
    1 3 8 +3-+43
    2 2 8
    1 1 8 5-221043
    2 4 9
    2 1 10
    2 2 2
    
    예상 출력
    326
    177
    51
    21043
    999778968
    0