import sys import random sys.setrecursionlimit(1 << 25) class Node: def __init__(self, val): self.val = val self.sum = val self.size = 1 self.priority = random.random() self.left = None self.right = None def update(self): self.size = 1 + (self.left.size if self.left else 0) + (self.right.size if self.right else 0) self.sum = self.val + (self.left.sum if self.left else 0) + (self.right.sum if self.right else 0) def get_size(node): return node.size if node else 0 def get_sum(node): return node.sum if node else 0 def split(node, k): if node is None: return (None, None) left_size = get_size(node.left) if left_size >= k: left, right = split(node.left, k) node.left = right node.update() return (left, node) else: remaining = k - left_size - 1 left_sub, right_sub = split(node.right, remaining) node.right = left_sub node.update() return (node, right_sub) def merge(left, right): if not left: return right if not right: 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(): import sys 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: root = merge(root, Node(a)) for _ in range(Q): T = int(input[ptr]) l = int(input[ptr+1]) r = int(input[ptr+2]) ptr += 3 if T == 1: left, temp = split(root, l-1) mid, right = split(temp, r - l + 1) sum_mid = get_sum(mid) new_node = Node(sum_mid) root = merge(merge(left, new_node), right) else: left, temp = split(root, l-1) mid, right = split(temp, r - l + 1) print(mid.sum) root = merge(merge(left, mid), right) if __name__ == '__main__': main()