import sys import random random.seed(0) class Node: __slots__ = ['val', 'prio', 'left', 'right', 'size', 'sum'] def __init__(self, val): self.val = val self.prio = random.randint(0, 1 << 60) self.left = None self.right = None self.size = 1 self.sum = val 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 not node: return (None, None) left_size = get_size(node.left) if left_size >= k: 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 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(): data = sys.stdin.read().split() ptr = 0 n = int(data[ptr]) ptr += 1 q = int(data[ptr]) ptr += 1 A = list(map(int, data[ptr:ptr + n])) ptr += n root = None for a in A: new_node = Node(a) root = merge(root, new_node) outputs = [] for _ in range(q): T = int(data[ptr]) ptr += 1 l = int(data[ptr]) ptr += 1 r = int(data[ptr]) ptr += 1 if T == 1: left_part, right_part = split(root, r) left, mid = split(left_part, l - 1) sum_mid = get_sum(mid) new_node = Node(sum_mid) root = merge(merge(left, new_node), right_part) else: left_part, right_part = split(root, r) left, mid = split(left_part, l - 1) outputs.append(str(get_sum(mid))) root = merge(merge(left, mid), right_part) print('\n'.join(outputs)) if __name__ == "__main__": main()