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

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

수열과 쿼리 12

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

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

어려움10점 중 9점

유형
세그먼트 트리, 해시맵, 조합론, 구현
정답자
아직 제출이 없습니다

문제

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

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

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

(∑1≤i<j<k≤∣S∣SiSjSk) 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개의 줄에 쿼리가 한 줄에 하나씩 주어진다.

  • 1≤N,M≤100,0001 \le N, M \le 100{,}000
  • 1≤Ai,y≤109+61 \le A_i, y \le 10^9+6
  • 1≤x≤∣A∣1 \le x \le |A|
  • 1≤l≤r≤∣A∣1 \le l \le r \le |A|
  • 0≤z≤∣A∣0 \le z \le |A|

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

출력

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

예제2

  1. 예제 1

    입력
    5
    1 2 3 2 1
    8
    1 1 3
    5 1 5
    2 2 4
    1 2 4
    3 3
    4 0 5
    1 1 2
    1 1 5
    
    예상 출력
    6
    3
    24
    0
    78
    
  2. 예제 2

    입력
    10
    5 4 3 5 4 1 5 4 3 1
    15
    2 8 580347
    4 6 503576
    1 2 5
    5 8 11
    1 2 6
    4 7 565239
    3 6
    3 11
    3 3
    2 9 674360
    1 1 6
    2 2 589693
    4 5 236488
    1 8 9
    5 2 7
    
    예상 출력
    60
    4
    107
    788510349
    0
    6