만드는 중입니다

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

Majorant

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

요약
배열의 원소를 바꾸는 갱신과 구간 질의가 주어질 때, 구간 안 부분배열마다 과반 원소 i의 개수에 i를 곱해 모두 더한 값을 998244353으로 나눈 나머지를 구합니다.
난이도

어려움10점 중 8점

유형
배열, 세그먼트 트리, 분할 정복
정답자
아직 제출이 없습니다

문제

다중집합의 majorant는 다른 모든 원소를 합친 것보다 더 많이 등장하는 원소이다. majorant가 없는 다중집합도 있다.

양의 정수 nn개로 이루어진 배열 a1,a2,…,ana_1, a_2, \ldots, a_n이 주어진다. 배열 aa의 부분 배열은 1≤l≤r≤n1 \le l \le r \le n을 만족하는 al,al+1,…,ara_l, a_{l+1}, \ldots, a_r이다.

질의는 mm개이며, 두 종류가 있다.

  1. Update p q: apa_p의 값을 qq로 바꾼다.
  2. Query p q (p≤qp \le q): b1=ap,b2=ap+1,…,bq−p+1=aqb_1 = a_p, b_2 = a_{p+1}, \ldots, b_{q-p+1} = a_q라 하자. bb의 부분 배열 중 ii가 majorant인 부분 배열의 개수에 ii를 곱한 값을 구한다. 이 값을 bb의 어떤 부분 배열이든 majorant로 갖는 서로 다른 모든 ii에 대해 더하고, 그 합을 998244353으로 나눈 나머지를 구한다.

입력

첫 줄에 nn이 주어진다. 둘째 줄에 배열의 원소 nn개가 주어진다. 셋째 줄에 mm이 주어진다. 이어서 mm개의 줄에 암호화된 질의를 나타내는 정수 ll, rr, tt가 하나씩 주어진다.

last_output은 프로그램이 표준 출력에 마지막으로 출력한 수이다. 아직 출력한 수가 없으면 0으로 한다.

type=((t+last_output) mod 2)+1type = ((t + last\_output) \bmod 2) + 1을 계산한다.

type=1type = 1이면 Update 질의이며, p=((l+last_output) mod n)+1p = ((l + last\_output) \bmod n) + 1, q=((r+last_output) mod 100000000)+1q = ((r + last\_output) \bmod 100000000) + 1이다.

type=2type = 2이면 Query 질의이며, p=((l+last_output) mod n)+1p = ((l + last\_output) \bmod n) + 1, q=((r+last_output) mod n)+1q = ((r + last\_output) \bmod n) + 1이다.

출력

type이 2인 질의마다 답을 한 줄에 하나씩 출력한다.

제한

  • 1≤n≤2000001 \le n \le 200000
  • 배열 aa의 모든 원소 xx는 1≤x≤1000000001 \le x \le 100000000을 만족한다.
  • 1≤m≤1001 \le m \le 100
  • 1≤l,r,t≤1000000001 \le l, r, t \le 100000000

힌트

복호화하면 첫 번째 질의는 query, p=1, q=4가 된다. majorant가 1인 부분 배열은 2개, majorant가 2인 부분 배열은 5개이므로 답은 2⋅1+5⋅2=122 \cdot 1 + 5 \cdot 2 = 12이다.

두 번째 질의는 update, p=3, q=3이 된다. 이후 배열은 1, 2, 3, 1이 된다.

세 번째 질의는 query, p=1, q=3이다. majorant가 1인 부분 배열은 1개, 2인 부분 배열은 1개, 3인 부분 배열은 1개 있다.

예제1

  1. 예제 1

    입력
    4
    1 2 2 1
    3
    4 3 1
    2 99999990 2
    4 2 1
    
    예상 출력
    12
    6