import sys import random random.seed(0) class Node: __slots__ = ['left', 'right', 'prio', 'val', 'sum', 'size'] def __init__(self, val): self.left = None self.right = None self.prio = random.randint(1, 10**18) self.val = val self.sum = val self.size = 1 def update(node): if node: left_size = node.left.size if node.left else 0 right_size = node.right.size if node.right else 0 node.size = 1 + left_size + right_size left_sum = node.left.sum if node.left else 0 right_sum = node.right.sum if node.right else 0 node.sum = node.val + left_sum + right_sum def split(node, k): if not node: return (None, None) if k <= 0: return (None, node) left_size = node.left.size if node.left else 0 if left_size + 1 <= k: k_remaining = k - (left_size + 1) l, r = split(node.right, k_remaining) node.right = l update(node) return (node, r) else: l, r = split(node.left, k) node.left = r update(node) return (l, node) def merge(a, b): if not a: return b if not b: return a if a.prio > b.prio: 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 queries = [] for _ in range(Q): T = int(input[ptr]) l = int(input[ptr+1]) r = int(input[ptr+2]) queries.append((T, l, r)) ptr += 3 root = None for val in A: new_node = Node(val) root = merge(root, new_node) for q in queries: T, l, r = q if T == 1: left_part, rest = split(root, l-1) middle_part, right_part = split(rest, r - l + 1) sum_middle = middle_part.sum if middle_part else 0 new_node = Node(sum_middle) root = merge(merge(left_part, new_node), right_part) else: left_part, rest = split(root, l-1) middle_part, right_part = split(rest, r - l + 1) print(middle_part.sum if middle_part else 0) root = merge(merge(left_part, middle_part), right_part) if __name__ == "__main__": main()