結果
| 問題 |
No.2080 Simple Nim Query
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 22:26:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,769 bytes |
| コンパイル時間 | 157 ms |
| コンパイル使用メモリ | 82,000 KB |
| 実行使用メモリ | 167,888 KB |
| 最終ジャッジ日時 | 2025-04-15 22:28:39 |
| 合計ジャッジ時間 | 9,847 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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()
lam6er