class FenwickTree:
    def __init__(self, size):
        self.size = size
        self.tree = [0] * (size + 1)

    def add(self, index, value):
        while index <= self.size:
            self.tree[index] += value
            index += index & -index

    def sum(self, index):
        total = 0
        while index > 0:
            total += self.tree[index]
            index -= index & -index
        return total

    def range_add(self, left, right, value):
        self.add(left, value)
        self.add(right + 1, -value)

    def range_sum(self, left, right):
        return self.sum(right) - self.sum(left - 1)

import sys

def main():
    input = sys.stdin.read
    data = input().strip().split()
    
    index = 0
    N = int(data[index])
    Q = int(data[index + 1])
    index += 2

    P = list(map(int, data[index:index + N]))
    index += N

    # Create Fenwick Tree for handling updates and queries
    fenwick = FenwickTree(N)

    result = []
    for _ in range(Q):
        T = int(data[index])
        if T == 0:
            l = int(data[index + 1])
            r = int(data[index + 2])
            c = int(data[index + 3])
            fenwick.range_add(l, r, c)
            index += 4
        elif T == 1:
            l = int(data[index + 1])
            r = int(data[index + 2])
            c = int(data[index + 3])
            fenwick.range_add(P[l - 1], P[r - 1], c)  # use P to index
            index += 4
        elif T == 2:
            l = int(data[index + 1])
            r = int(data[index + 2])
            result.append(fenwick.range_sum(l, r))
            index += 3
        elif T == 3:
            l = int(data[index + 1])
            r = int(data[index + 2])
            result.append(fenwick.range_sum(P[l - 1], P[r - 1]))  # use P to index
            index += 3

    # Print results for all queries of type 2 and 3
    sys.stdout.write('\n'.join(map(str, result)) + '\n')

if __name__ == "__main__":
    main()