結果

問題 No.1441 MErGe
ユーザー lam6er
提出日時 2025-03-31 17:25:38
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 2,654 bytes
コンパイル時間 321 ms
コンパイル使用メモリ 82,112 KB
実行使用メモリ 119,208 KB
最終ジャッジ日時 2025-03-31 17:26:54
合計ジャッジ時間 11,217 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 8 TLE * 4 -- * 16
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import random

class TreapNode:
    def __init__(self, value):
        self.value = value
        self.priority = random.random()
        self.left = None
        self.right = None
        self.size = 1
        self.sum = value

    def update(self):
        self.size = 1
        self.sum = self.value
        if self.left is not None:
            self.size += self.left.size
            self.sum += self.left.sum
        if self.right is not None:
            self.size += self.right.size
            self.sum += self.right.sum

def build(arr, start, end):
    if start > end:
        return None
    mid = (start + end) // 2
    node = TreapNode(arr[mid])
    node.left = build(arr, start, mid - 1)
    node.right = build(arr, mid + 1, end)
    node.update()
    return node

def split(node, key):
    if node is None:
        return (None, None)
    left_size = node.left.size if node.left else 0
    if key <= left_size:
        left, temp = split(node.left, key)
        node.left = temp
        node.update()
        return (left, node)
    else:
        temp, right = split(node.right, key - left_size - 1)
        node.right = temp
        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 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 = build(A, 0, N-1)

    for _ in range(Q):
        T = int(input[ptr])
        l = int(input[ptr+1])
        r = int(input[ptr+2])
        ptr +=3

        if T == 1:
            if l > 1:
                left, temp = split(root, l-1)
            else:
                left = None
                temp = root
            mid, right = split(temp, r - l + 1)
            sum_val = mid.sum if mid else 0
            new_node = TreapNode(sum_val)
            new_tree = merge(left, new_node)
            root = merge(new_tree, right)
        else:
            if l > 1:
                left, temp = split(root, l-1)
            else:
                left = None
                temp = root
            mid, right = split(temp, r - l + 1)
            sum_val = mid.sum if mid else 0
            merged_temp = merge(mid, right)
            root = merge(left, merged_temp)
            print(sum_val)

if __name__ == "__main__":
    main()
0