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

    def update(self, idx, delta):
        while idx <= self.size:
            self.tree[idx] += delta
            idx += idx & -idx

    def query(self, idx):
        result = 0
        while idx > 0:
            result += self.tree[idx]
            idx -= idx & -idx
        return result

    def range_update(self, left, right, delta):
        self.update(left, delta)
        self.update(right + 1, -delta)
        
    def range_query(self, left, right):
        return self.query(right) - self.query(left - 1)

# Read input
import sys
input = sys.stdin.read
data = input().split()

N = int(data[0])
Q = int(data[1])

# Read permutation P
P = list(map(int, data[2:2 + N]))

# Initialize Fenwick Trees for original indices and permutation indices
original_tree = FenwickTree(N)
permutation_tree = FenwickTree(N)

output = []
idx = 2 + N
for _ in range(Q):
    T = int(data[idx])
    if T == 0:
        l = int(data[idx + 1])
        r = int(data[idx + 2])
        c = int(data[idx + 3])
        original_tree.range_update(l, r, c)
        idx += 4
    elif T == 1:
        l = int(data[idx + 1])
        r = int(data[idx + 2])
        c = int(data[idx + 3])
        permutation_tree.range_update(l, r, c)
        idx += 4
    elif T == 2:
        l = int(data[idx + 1])
        r = int(data[idx + 2])
        result = original_tree.range_query(l, r)
        output.append(result)
        idx += 3
    elif T == 3:
        l = int(data[idx + 1])
        r = int(data[idx + 2])
        result = permutation_tree.range_query(l, r)
        output.append(result)
        idx += 3

# Print all results for the queries
print("\n".join(map(str, output)))
