만드는 중입니다

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

게임 이론

시간 제한1초메모리 제한1024 MB

요약
구간을 뒤집는 변경이 q번 주어질 때마다, 모든 비트가 0이 될 때까지 Bobo가 뒤집는 횟수를 998244353으로 나눈 나머지로 구합니다.
난이도

보통10점 중 7점

유형
세그먼트 트리, 수학, 게임 이론
정답자
아직 제출이 없습니다

문제

0과 1로 이루어진 nn비트 문자열 s1…sns_1 \dots s_n에 대해, Bobo는 다음 게임을 진행하여 ff값을 계산합니다.

  • 모든 비트가 0이면 게임이 끝납니다.
  • 비트 문자열에 1이 kk개 있으면, Bobo는 sks_k를 뒤집습니다.

비트 문자열의 ff값은 게임이 끝나기 전까지 Bobo가 뒤집은 횟수입니다.

형식으로 쓰면 다음과 같습니다.

  • s1=⋯=sn=0s_1 = \dots = s_n = 0이면 f(s1…sn)=0f(s_1 \dots s_n) = 0입니다.
  • 그렇지 않으면, k=s1+⋯+snk = s_1 + \dots + s_n일 때 f(s1…sn)=f(s1…sk−1sk‾sk+1…sn)+1f(s_1 \dots s_n) = f(s_1 \dots s_{k-1} \overline{s_k} s_{k+1} \dots s_n) + 1입니다. 여기서 c‾\overline{c}는 비트 cc를 뒤집은 값으로, 0‾=1\overline{0} = 1, 1‾=0\overline{1} = 0입니다.

이제 Bobo에게 비트 문자열 s1…sns_1 \dots s_n이 주어지고, 이 문자열에 qq번의 변경이 가해집니다. ii번째 변경은 주어진 lil_i, rir_i에 대해 sli…sris_{l_i} \dots s_{r_i}의 모든 비트를 뒤집습니다. 각 변경 후 비트 문자열의 ff값을 998244353998244353으로 나눈 나머지를 구하세요.

입력

입력은 여러 개의 테스트 케이스로 구성되며, 파일 끝(EOF)에서 끝납니다. 각 테스트 케이스는 다음 형식입니다.

첫 번째 줄에 정수 nn과 qq가 주어집니다.

두 번째 줄에 nn개의 비트 s1…sns_1 \dots s_n이 주어집니다.

이어지는 qq개의 줄에는 각각 정수 lil_i와 rir_i가 주어집니다.

출력

각 변경 후 비트 문자열의 ff값을 998244353998244353으로 나눈 나머지를 한 줄에 하나씩 출력하세요.

제한

  • 1≤n≤2×1051 \le n \le 2 \times 10^5
  • 1≤q≤2×1051 \le q \le 2 \times 10^5
  • 각 1≤i≤n1 \le i \le n에 대해 si∈{0,1}s_i \in \{0, 1\}
  • 각 1≤i≤q1 \le i \le q에 대해 1≤li≤ri≤n1 \le l_i \le r_i \le n
  • 각 입력에서 nn의 합은 2×1052 \times 10^5을 넘지 않고, qq의 합도 2×1052 \times 10^5을 넘지 않습니다.

힌트

첫 번째 테스트 케이스에서 첫 번째 변경 후 문자열은 100이 됩니다. 따라서 f(100)=f(000)+1=1f(\texttt{100}) = f(\texttt{000}) + 1 = 1입니다. 두 번째 변경 후에는 111이 되며, f(111)=f(110)+1=f(100)+2=f(000)+3=3f(\texttt{111}) = f(\texttt{110}) + 1 = f(\texttt{100}) + 2 = f(\texttt{000}) + 3 = 3입니다.

예제1

  1. 예제 1

    입력
    3 2
    010
    1 2
    2 3
    5 1
    00000
    1 5
    
    예상 출력
    1
    3
    5