結果
問題 |
No.1441 MErGe
|
ユーザー |
![]() |
提出日時 | 2025-04-15 21:11:08 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,453 bytes |
コンパイル時間 | 483 ms |
コンパイル使用メモリ | 82,192 KB |
実行使用メモリ | 127,000 KB |
最終ジャッジ日時 | 2025-04-15 21:17:03 |
合計ジャッジ時間 | 8,756 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 6 TLE * 3 -- * 19 |
ソースコード
import sys import random random.seed(42) class Node: __slots__ = ['key', 'sum', 'size', 'pri', 'left', 'right'] def __init__(self, key): self.key = key self.sum = key self.size = 1 self.pri = random.randint(1, 10**18) self.left = None self.right = None def update(node): if node is None: return left_size = node.left.size if node.left else 0 left_sum = node.left.sum if node.left else 0 right_size = node.right.size if node.right else 0 right_sum = node.right.sum if node.right else 0 node.size = 1 + left_size + right_size node.sum = node.key + left_sum + right_sum def split(node, k): if node is None: return (None, None) left_size = node.left.size if node.left else 0 if left_size >= k: left, right = split(node.left, k) node.left = right update(node) return (left, node) else: right_k = k - left_size - 1 left_sub, right = split(node.right, right_k) node.right = left_sub update(node) return (node, right) def merge(a, b): if a is None: return b if b is None: return a if a.pri > b.pri: a.right = merge(a.right, b) update(a) return a else: b.left = merge(a, b.left) update(b) return b def build_tree(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 root = build_tree(A) for _ in range(Q): T = int(input[ptr]) ptr += 1 l = int(input[ptr]) ptr += 1 r = int(input[ptr]) ptr += 1 if T == 1: left, rest = split(root, l-1) mid, right = split(rest, r - l + 1) sum_mid = mid.sum if mid else 0 new_node = Node(sum_mid) new_left = merge(left, new_node) root = merge(new_left, right) else: left, rest = split(root, l-1) mid, right = split(rest, r - l + 1) sum_mid = mid.sum if mid else 0 merged_rest = merge(mid, right) root = merge(left, merged_rest) print(sum_mid) if __name__ == '__main__': main()