結果
問題 |
No.1441 MErGe
|
ユーザー |
![]() |
提出日時 | 2025-06-12 18:19:40 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,557 bytes |
コンパイル時間 | 239 ms |
コンパイル使用メモリ | 82,136 KB |
実行使用メモリ | 119,400 KB |
最終ジャッジ日時 | 2025-06-12 18:20:03 |
合計ジャッジ時間 | 7,669 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 8 TLE * 4 -- * 16 |
ソースコード
import sys import random random.seed(42) class Node: def __init__(self, value): self.value = value self.sum = value self.size = 1 self.priority = random.random() self.left = None self.right = None def update(self): self.size = 1 self.sum = self.value if self.left: self.size += self.left.size self.sum += self.left.sum if self.right: self.size += self.right.size self.sum += self.right.sum def split(node, pos): if node is None: return (None, None) left_size = node.left.size if node.left else 0 if pos <= left_size: left, right = split(node.left, pos) node.left = right node.update() return (left, node) else: left, right = split(node.right, pos - left_size - 1) node.right = left node.update() return (node, right) def merge(left, right): if left is None: return right if right is None: return left if left.priority > right.priority: left.right = merge(left.right, right) left.update() return left else: right.left = merge(left, right.left) right.update() return right def build_treap(arr): root = None for num in arr: new_node = Node(num) root = merge(root, new_node) return root def main(): 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 queries = [] for _ in range(Q): T = int(input[ptr]) ptr += 1 l = int(input[ptr]) ptr += 1 r = int(input[ptr]) ptr += 1 queries.append((T, l, r)) root = build_treap(A) for query in queries: T, l, r = query if T == 1: l0 = l - 1 r0 = r - 1 left_part, rest = split(root, l0) mid_part, right_part = split(rest, (r0 - l0) + 1) sum_val = mid_part.sum if mid_part else 0 new_node = Node(sum_val) root = merge(merge(left_part, new_node), right_part) else: l0 = l - 1 r0 = r - 1 left_part, rest = split(root, l0) mid_part, right_part = split(rest, (r0 - l0) + 1) print(mid_part.sum if mid_part else 0) root = merge(merge(left_part, mid_part), right_part) if __name__ == "__main__": main()