만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

매기의 숙제

시간 제한4초메모리 제한1024 MB

요약
구간의 숫자를 같은 숫자로 바꾸는 연산과, 구간 안에서 0으로 시작하지 않는 모든 부분문자열 값의 합을 10^9+7로 나눈 나머지로 구하는 질의가 주어집니다.
난이도

보통10점 중 7점

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

문제

매기 심슨이 서른 번째 시즌 만에 드디어 1학년이 되었다. 선생님은 글씨 연습을 위해 0부터 9까지의 숫자 N개를 원하는 순서로 한 줄에 적어 오라는 숙제를 냈다.

몇 시간을 씨름한 끝에 매기는 숙제를 마치고 친구들과 놀러 나갔다. 숙제는 책상 위에 그대로 남았다. 그때 리사 심슨이 방에 들어와 그 공책을 보게 되었다.

리사는 적힌 숫자들의 합을 금방 구했다. 그러자 바트 심슨이 더 어려운 문제를 냈다. 이 숫자 문자열에 M번의 연산을 수행하라는 것이다. 위치는 왼쪽부터 1번에서 N번까지 번호가 매겨지고, 연산은 두 종류다.

1 lil_i rir_i cic_i: lil_i번 위치부터 rir_i번 위치까지의 모든 숫자를 숫자 cic_i로 바꾼다.

2 lil_i rir_i: lil_i번 위치부터 rir_i번 위치까지의 구간에서 부분 문자열로 나타나는 모든 수를 더한다. 같은 수가 구간에 여러 번 나오면 나온 횟수만큼 더한다. 0으로 시작하는 부분 문자열은 올바른 십진수 표기가 아니므로 합에 넣지 않는다. 답은 109+710^9 + 7로 나눈 나머지를 출력한다.

입력

첫째 줄에 숫자의 개수 N과 바트의 연산 개수 M이 공백으로 구분되어 주어진다(1≤N,M≤1000001 \le N, M \le 100000).

둘째 줄에는 0부터 9까지의 숫자 N개가 공백으로 구분되어 주어진다.

이후 M개의 줄에 연산이 주어진다. 1 lil_i rir_i cic_i 형태는 첫 번째 종류의 연산이며 1≤li≤ri≤N1 \le l_i \le r_i \le N, 0≤ci≤90 \le c_i \le 9이다. 2 lil_i rir_i 형태는 두 번째 종류의 연산이며 1≤li≤ri≤N1 \le l_i \le r_i \le N이다.

출력

두 번째 종류의 연산마다 답을 109+710^9 + 7로 나눈 나머지를 한 줄에 하나씩 출력한다. 두 번째 종류의 연산이 없으면 아무것도 출력하지 않는다.

참고

첫 번째 예제에서 첫 번째 2번 연산의 답은 1+12+121+2+21+1=1581 + 12 + 121 + 2 + 21 + 1 = 158이다. 두 번째 2번 연산의 답은 2+20+203+0+3=2282 + 20 + 203 + 0 + 3 = 228이다. 03은 올바른 정수의 십진수 표기가 아니므로 이 구간에서는 더해지는 항이 더 적다.

예제2

  1. 예제 1

    입력
    4 3
    1 2 1 3
    2 1 3
    1 3 3 0
    2 2 4
    
    예상 출력
    158
    228
    
  2. 예제 2

    입력
    9 3
    1 1 1 1 1 1 1 1 1
    2 1 9
    1 1 9 9
    2 1 9
    
    예상 출력
    137174205
    234567838