수열과 쿼리 12

수열에 값 변경, 삭제, 삽입 연산이 가해질 때 구간의 서로 다른 값 개수와 서로 다른 값들의 삼중 곱 합을 구한다.

어려움9세그먼트 트리해시맵조합론구현아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

길이가 NN인 수열 A1,A2,,ANA_1, A_2, \dots, A_N이 주어진다. 이 수열에 다음 다섯 종류의 쿼리를 주어진 순서대로 처리하는 프로그램을 작성하시오.

  • 1 l r: ll번째 수부터 rr번째 수까지에 나오는 서로 다른 값을 오름차순으로 정렬한 집합을 SS라고 할 때, 아래 값을 출력한다.
  • 2 x y: AxA_xyy로 바꾼다.
  • 3 x: xx번째 수를 지운다.
  • 4 z y: zz번째 수의 바로 뒤에 yy를 넣는다. z=0z = 0이면 수열의 맨 앞에 yy를 넣는다.
  • 5 l r: ll번째 수부터 rr번째 수까지에 나오는 서로 다른 수의 개수를 출력한다.

1번 쿼리의 답은 다음과 같다.

(1i<j<kSSiSjSk)mod(109+7)\left(\sum_{1 \le i < j < k \le |S|} S_i S_j S_k\right) \bmod (10^9+7)

수열의 인덱스는 1부터 시작한다. 같은 값이 구간 안에 여러 번 나와도 SS에는 한 번만 들어가고, S|S|가 3보다 작으면 1번 쿼리의 답은 0이다. 수열의 크기는 항상 1 이상이다.

입력

첫째 줄에 수열의 크기 NN이 주어진다.

둘째 줄에 A1,A2,,ANA_1, A_2, \dots, A_N이 주어진다.

셋째 줄에 쿼리의 개수 MM이 주어진다.

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

  • 1N,M100,0001 \le N, M \le 100{,}000
  • 1Ai,y109+61 \le A_i, y \le 10^9+6
  • 1xA1 \le x \le |A|
  • 1lrA1 \le l \le r \le |A|
  • 0zA0 \le z \le |A|

여기서 A|A|는 그 쿼리를 처리하기 직전의 수열의 크기다.

출력

1번 쿼리와 5번 쿼리의 답을 주어진 순서대로 한 줄에 하나씩 출력한다.