結果
問題 |
No.1441 MErGe
|
ユーザー |
![]() |
提出日時 | 2025-06-12 12:56:10 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,018 bytes |
コンパイル時間 | 470 ms |
コンパイル使用メモリ | 82,664 KB |
実行使用メモリ | 155,872 KB |
最終ジャッジ日時 | 2025-06-12 13:01:41 |
合計ジャッジ時間 | 14,248 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 6 TLE * 6 -- * 16 |
ソースコード
import sys import random random.seed(0) class Node: __slots__ = ['val', 'sum', 'size', 'priority', 'left', 'right'] def __init__(self, val): self.val = val self.sum = val self.size = 1 self.priority = random.randint(0, 1 << 60) self.left = None self.right = None def get_size(node): return node.size if node else 0 def get_sum(node): return node.sum if node else 0 def update(node): if node: node.size = 1 + get_size(node.left) + get_size(node.right) node.sum = node.val + get_sum(node.left) + get_sum(node.right) def split(node, k): if node is None: return (None, None) left_size = get_size(node.left) if k <= left_size: l, r = split(node.left, k) node.left = r update(node) return (l, node) else: l, r = split(node.right, k - left_size - 1) node.right = l update(node) return (node, r) def merge(a, b): if a is None: return b if b is None: return a if a.priority > b.priority: a.right = merge(a.right, b) update(a) return a else: b.left = merge(a, b.left) update(b) return b def main(): input = sys.stdin.read().split() ptr = 0 N, Q = int(input[ptr]), int(input[ptr+1]) ptr += 2 A = list(map(int, input[ptr:ptr+N])) ptr += N root = None for a in A: new_node = Node(a) root = merge(root, new_node) for _ in range(Q): T = int(input[ptr]) l = int(input[ptr+1]) r = int(input[ptr+2]) ptr += 3 left, temp = split(root, l-1) middle, right = split(temp, r - l + 1) if T == 1: sum_middle = get_sum(middle) new_node = Node(sum_middle) root = merge(merge(left, new_node), right) else: print(get_sum(middle)) root = merge(merge(left, middle), right) if __name__ == "__main__": main()