만드는 중입니다

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

수열과 가중 합 쿼리

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

요약
삽입, 삭제, 교체가 일어나는 수열에서 각 원소에 왼쪽 끝 기준 위치의 k제곱(k는 10 이하)을 곱한 합을 구간별로 계산한다.
난이도

어려움10점 중 8점

유형
트리, 이분 탐색, 누적 합, 수학
정답자
아직 제출이 없습니다

문제

길이가 NN인 수열 A0,A1,…,AN−1A_0, A_1, \dots, A_{N-1}이 주어진다. 모든 원소는 0≤Ai<2320 \le A_i < 2^{32}를 만족한다. 아래 네 가지 쿼리를 주어진 순서대로 처리하는 프로그램을 작성하시오.

  • 1 p v: ApA_p의 앞에 vv를 삽입한다. pp가 수열의 길이와 같으면 맨 뒤에 붙인다. (0≤p≤0 \le p \le 수열의 길이, 0≤v<2320 \le v < 2^{32})
  • 2 p: ApA_p를 제거한다. (0≤p<0 \le p < 수열의 길이)
  • 3 p v: ApA_p를 vv로 바꾼다. (0≤p<0 \le p < 수열의 길이, 0≤v<2320 \le v < 2^{32})
  • 4 l r k: (∑i=lrAi×(i−l+1)k) mod 232\left( \sum_{i=l}^{r} A_i \times (i - l + 1)^k \right) \bmod 2^{32}을 출력한다. (0≤l≤r<0 \le l \le r < 수열의 길이, 0≤k≤100 \le k \le 10)

삽입이나 삭제가 일어나면 그 뒤에 있던 원소의 번호가 한 칸씩 밀리거나 당겨진다. 쿼리에 주어지는 pp, ll, rr은 그 쿼리를 처리하는 시점의 수열을 기준으로 한다.

4번 쿼리의 가중치 (i−l+1)k(i - l + 1)^k는 구간의 왼쪽 끝을 1로 세는 상대 위치를 kk제곱한 값이다.

입력

첫째 줄에 수열의 크기 NN (1≤N≤1000001 \le N \le 100000)이 주어진다.

둘째 줄에 A0,A1,…,AN−1A_0, A_1, \dots, A_{N-1}이 공백으로 구분되어 주어진다.

셋째 줄에 쿼리의 개수 MM (1≤M≤1000001 \le M \le 100000)이 주어진다.

넷째 줄부터 MM개의 줄에 쿼리가 한 줄에 하나씩 주어진다.

출력

4번 쿼리마다 답을 한 줄에 하나씩 출력한다. 1번, 2번, 3번 쿼리는 아무것도 출력하지 않는다.

예제2

  1. 예제 1

    입력
    4
    1 2 3 5
    7
    4 0 2 0
    1 3 4
    4 2 4 1
    2 0
    4 0 3 1
    3 1 2
    4 0 1 0
    
    예상 출력
    6
    26
    40
    4
    
  2. 예제 2

    입력
    1
    4294967295
    7
    4 0 0 0
    4 0 0 10
    3 0 1
    1 0 7
    4 0 1 1
    2 1
    4 0 0 5
    
    예상 출력
    4294967295
    4294967295
    9
    7