만드는 중입니다

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

수열

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

요약
배열에 대해 구간 값을 k칸 앞 값으로 덮어쓰기, 원본으로 되돌리기, 구간 합 구하기 연산을 수행하고 합 질의의 결과를 구합니다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 배열, 시뮬레이션
정답자
아직 제출이 없습니다

문제

Yuta에게 nn개의 정수로 이루어진 배열 A1,A2,…,AnA_1, A_2, \ldots, A_n이 있다. Yuta는 배열 AA의 초기 내용을 A′A'에 복사해 보관한다. 처음에는 Ai′=AiA'_i = A_i이다. 그 뒤 Yuta는 배열 AA에 대해 mm개의 연산을 차례로 수행한다.

연산은 세 종류가 있다.

  • 1 l r: ll 이상 rr 이하인 모든 ii에 대해 AiA_i의 합을 구한다.
  • 2 l r k: 배열 AA에 다음 코드를 그대로 실행한다. for (int i = l; i <= r; i++) A[i] = A[i - k];
  • 3 l r: ll 이상 rr 이하인 모든 ii에 대해 AiA_i를 Ai′A'_i의 값으로 되돌린다.

입력

첫째 줄에 nn과 mm이 주어진다. (1≤n,m≤2⋅1051 \leq n, m \leq 2 \cdot 10^5)

둘째 줄에 정수 A1,…,AnA_1, \ldots, A_n이 주어진다. (0≤Ai≤1090 \leq A_i \leq 10^9)

이후 mm개의 줄에 연산이 한 줄씩 주어진다. 모든 연산은 1≤l≤r≤n1 \leq l \leq r \leq n과 1≤k<l1 \leq k < l을 만족한다.

출력

종류가 1인 연산마다 구한 합을 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    5 7
    1 2 3 4 5
    1 1 5
    2 3 4 1
    1 1 5
    2 3 4 2
    1 1 5
    3 1 5
    1 1 5
    
    예상 출력
    15
    12
    11
    15