結果
| 問題 | No.2611 Count 01 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2024-01-19 18:43:20 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 2,728 ms / 6,000 ms | 
| コード長 | 4,859 bytes | 
| コンパイル時間 | 179 ms | 
| コンパイル使用メモリ | 82,424 KB | 
| 実行使用メモリ | 241,468 KB | 
| 最終ジャッジ日時 | 2024-09-28 03:45:45 | 
| 合計ジャッジ時間 | 53,884 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 20 | 
ソースコード
import sys
input = sys.stdin.readline
class SegmentTree:
    def __init__(self, n, e):
        n2 = 1
        while n2 < n:
            n2 *= 2
        self.n = n2
        self.data = [e] * (n2 * 2)
    def build(self, a):
        for i, x in enumerate(a):
            self.data[i + self.n] = x
        for i in range(self.n - 1, 0, -1):
            self.data[i] = self.data[i * 2] + self.data[i * 2 + 1]
    def update(self, i, x):
        k = i + self.n
        self.data[k] = x
        while k > 1:
            k //= 2
            self.data[k] = self.data[k * 2] + self.data[k * 2 + 1]
    def query(self, l, r, ls, rs):
        l += self.n
        r += self.n
        while l < r:
            if l & 1:
                ls += self.data[l]
                l += 1
            if r & 1:
                r -= 1
                rs = self.data[r] + rs
            l //= 2
            r //= 2
        return ls + rs
MOD = 998244353
class Vec:
    def __init__(self, a):
        self.a = a
    def __add__(self, other):
        if other.a is None:
            return self
        if self.a is None:
            return other
        if isinstance(other, Matrix):
            result = self.a[:]
            result[0] += self.a[1] * other.a[0]
            result[0] += self.a[2] * other.a[1]
            result[1] += self.a[2] * other.a[2]
            result[0] += self.a[3] * other.a[3]
            result[1] += self.a[3] * other.a[4]
            result[2] += self.a[3] * other.a[5]
            result[0] += self.a[4] * other.a[6]
            result[1] += self.a[4] * other.a[7]
            result[2] += self.a[4] * other.a[8]
            result[3] += self.a[4] * other.a[9]
            result[0] += self.a[5] * other.a[10]
            result[1] += self.a[5] * other.a[11]
            result[2] += self.a[5] * other.a[12]
            result[3] += self.a[5] * other.a[13]
            result[4] += self.a[5] * other.a[14]
            for i in range(len(self.a)):
                result[i] %= MOD
            return Vec(result)
        return sum(x * y for x, y in zip(self.a, other.a)) % MOD
class Matrix:
    size = 6
    def __init__(self, a):
        self.a = a
    def __add__(self, other):
        if other.a is None:
            return self
        if self.a is None:
            return other
        if isinstance(other, Vec):
            result = other.a[:]
            result[1] += self.a[0] * other.a[0]
            result[2] += self.a[1] * other.a[0]
            result[2] += self.a[2] * other.a[1]
            result[3] += self.a[3] * other.a[0]
            result[3] += self.a[4] * other.a[1]
            result[3] += self.a[5] * other.a[2]
            result[4] += self.a[6] * other.a[0]
            result[4] += self.a[7] * other.a[1]
            result[4] += self.a[8] * other.a[2]
            result[4] += self.a[9] * other.a[3]
            result[5] += self.a[10] * other.a[0]
            result[5] += self.a[11] * other.a[1]
            result[5] += self.a[12] * other.a[2]
            result[5] += self.a[13] * other.a[3]
            result[5] += self.a[14] * other.a[4]
            for i in range(self.size):
                result[i] %= MOD
            return Vec(result)
        result = [i + j for i, j in zip(self.a, other.a)]
        result[1] += self.a[2] * other.a[0]
        result[3] += self.a[4] * other.a[0]
        result[3] += self.a[5] * other.a[1]
        result[4] += self.a[5] * other.a[2]
        result[6] += self.a[7] * other.a[0]
        result[6] += self.a[8] * other.a[1]
        result[6] += self.a[9] * other.a[3]
        result[7] += self.a[8] * other.a[2]
        result[7] += self.a[9] * other.a[4]
        result[8] += self.a[9] * other.a[5]
        result[10] += self.a[11] * other.a[0]
        result[10] += self.a[12] * other.a[1]
        result[10] += self.a[13] * other.a[3]
        result[10] += self.a[14] * other.a[6]
        result[11] += self.a[12] * other.a[2]
        result[11] += self.a[13] * other.a[4]
        result[11] += self.a[14] * other.a[7]
        result[12] += self.a[13] * other.a[5]
        result[12] += self.a[14] * other.a[8]
        result[13] += self.a[14] * other.a[9]
        for idx, _ in enumerate(result):
            result[idx] %= MOD
        return Matrix(result)
node = [
    Matrix([1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1]),
    Matrix([1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1]),
]
identity = Matrix(None)
n, q = map(int, input().split())
s = input().strip()
s_seq = [int(x) for x in s]
st = SegmentTree(n, identity)
st.build([node[x] for x in s_seq])
for _ in range(q):
    t, *args = map(int, input().split())
    if t == 1:
        i = args[0] - 1
        s_seq[i] = 1 - s_seq[i]
        st.update(i, node[s_seq[i]])
    else:
        l, r = args
        ans = st.query(l - 1, r, Vec([0, 0, 0, 0, 0, 1]), Vec([1, 0, 0, 0, 0, 0]))
        print(ans)
            
            
            
        