結果
問題 |
No.2080 Simple Nim Query
|
ユーザー |
![]() |
提出日時 | 2025-04-15 22:28:42 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,769 bytes |
コンパイル時間 | 172 ms |
コンパイル使用メモリ | 82,468 KB |
実行使用メモリ | 168,780 KB |
最終ジャッジ日時 | 2025-04-15 22:31:20 |
合計ジャッジ時間 | 10,195 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 1 WA * 7 |
ソースコード
import sys sys.setrecursionlimit(1 << 25) class SegmentTreeNode: def __init__(self, l, r): self.l = l self.r = r self.left = None self.right = None self.max_right_non_zero = -1 # position of the rightmost non-zero element, -1 if none def build(l, r, A): node = SegmentTreeNode(l, r) if l == r: if A[l] != 0: node.max_right_non_zero = l else: node.max_right_non_zero = -1 return node mid = (l + r) // 2 node.left = build(l, mid, A) node.right = build(mid + 1, r, A) # Update max_right_non_zero based on children node.max_right_non_zero = node.right.max_right_non_zero if node.right.max_right_non_zero != -1 else node.left.max_right_non_zero return node def update(pos, value, node): if node.l == node.r == pos: if value != 0: node.max_right_non_zero = pos else: node.max_right_non_zero = -1 return mid = (node.l + node.r) // 2 if pos <= mid: update(pos, value, node.left) else: update(pos, value, node.right) # Update max_right_non_zero based on children right_max = node.right.max_right_non_zero if node.right else -1 left_max = node.left.max_right_non_zero if node.left else -1 node.max_right_non_zero = right_max if right_max != -1 else left_max def query(l, r, node): if node.r < l or node.l > r: return -1 if l <= node.l and node.r <= r: return node.max_right_non_zero # Check right child first right_res = -1 if node.right: right_res = query(l, r, node.right) if right_res != -1: return right_res # Then check left child left_res = -1 if node.left: left_res = query(l, r, node.left) return left_res def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr +=1 Q = int(input[ptr]) ptr +=1 A = list(map(int, input[ptr:ptr+N])) ptr +=N # Convert A to 0-based root = build(0, N-1, A) for _ in range(Q): T = int(input[ptr]) ptr +=1 X = int(input[ptr])-1 # convert to 0-based ptr +=1 Y = int(input[ptr]) ptr +=1 if T == 1: # Update A[X] to Y A[X] = Y update(X, Y, root) else: # Query [X, Y-1] (original X and Y are 1-based, now X is 0-based, Y is Y-1 in 0-based) Y -=1 # convert to 0-based end pos = query(X, Y, root) if pos == -1: print("S") else: if A[pos] % 2 == 1: print("S") else: print("F") if __name__ == "__main__": main()