結果
| 問題 | 
                            No.3208 Parse AND OR Affection
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2025-05-28 00:56:30 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 3,195 ms / 5,000 ms | 
| コード長 | 2,209 bytes | 
| コンパイル時間 | 359 ms | 
| コンパイル使用メモリ | 82,304 KB | 
| 実行使用メモリ | 209,568 KB | 
| 最終ジャッジ日時 | 2025-06-02 00:59:10 | 
| 合計ジャッジ時間 | 40,441 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 20 | 
ソースコード
class SegmentTree:
    def __init__(self, arr, op, e):
        self.op = op
        self.e = e
        self.n = len(arr)
        self.log = (self.n - 1).bit_length()
        self.size = 1 << self.log
        self.tree = [self.e for _ in range(2 * self.size)]
        for i in range(self.n): self.tree[i + self.size] = arr[i]
        for i in range(self.size - 1, 0, -1): self.update(i)
    def update(self, i):
        self.tree[i] = self.op(self.tree[2 * i + 0], self.tree[2 * i + 1])
    def set(self, i, x):
        i += self.size
        self.tree[i] = x
        i >>= 1
        while i:
            self.update(i)
            i >>= 1
    def get(self, i):
        return self.tree[i + self.size]
    def prod(self, l, r):
        pl = self.e
        pr = self.e
        l += self.size
        r += self.size
        while l < r:
            if l & 1:
                pl = self.op(pl, self.tree[l])
                l += 1
            if r & 1:
                r -= 1
                pr = self.op(self.tree[r], pr)
            l >>= 1
            r >>= 1
        return self.op(pl, pr)
    def all_prod(self):
        return self.tree[1]
SIZE = 4
def mul(A, B):
    r = [[0] * SIZE for _ in range(SIZE)]
    for i in range(SIZE):
        for j in range(SIZE):
            for k in range(SIZE):
                r[i][j] += A[i][k] * B[k][j]
    return r
E = [[0] * SIZE for _ in range(SIZE)]
for i in range(SIZE): E[i][i] = 1
N, Q = map(int, input().split())
X = "+" + input()
init = []
for i in range(len(X) // 2):
    
    op, tf = X[2 * i + 0], X[2 * i + 1]
    
    mat = [[0] * SIZE for _ in range(SIZE)]
    if op == "+" and tf == "T":
        mat[0][1] = 1
        mat[1][1] = 1
    elif op == "*" and tf == "F":
        mat[0][0] = 1
        mat[1][0] = 1
    elif op == "^" and tf == "T":
        mat[0][1] = 1
        mat[1][0] = 1
    else:
        mat[0][0] = 1
        mat[1][1] = 1
    if tf == "T": mat[2][1] = 1
    else: mat[2][0] = 1
    mat[2][2] = 1
    mat[1][3] = 1
    mat[3][3] = 1
    init.append(mat)
seg = SegmentTree(init, mul, E)
for _ in range(Q):
    L, R = map(int, input().split())
    result = seg.prod(L // 2, R // 2 + 1)
    print(result[2][1] + result[2][3])