如题
class tree:
v = 0
add = 0
l = 0
r = 0
a = [0 for i in range(100010)]
t = [tree() for i in range(400010)]
def build(p, l, r):
t[p].l = l
t[p].r = r
if l == r:
t[p].v = a[l-1]
return
mid = (l + r) >> 1
build(p*2, l, mid)
build(p*2+1, mid+1, r)
t[p].v = t[p*2].v + t[p*2+1].v
def spread(p):
t[p*2].v += t[p].add * (t[p*2].r - t[p*2].l + 1)
t[p*2].add += t[p].add
t[p*2+1].v += t[p].add * (t[p*2+1].r - t[p*2+1].l + 1)
t[p*2+1].add += t[p].add
t[p].add = 0
def change(p, l, r, k):
if l <= t[p].l and t[p].r <= r:
t[p].v += k * (t[p].r - t[p].l + 1)
t[p].add += k
return
if t[p].add:
spread(p)
mid = (t[p].l + t[p].r) >> 1
if l <= mid:
change(p*2, l, r, k)
if mid < r:
change(p*2+1, l, r, k)
t[p].v = t[p*2].v + t[p*2+1].v
def check(p, l, r):
if l <= t[p].l and t[p].r <= r:
return t[p].v
if t[p].add:
spread(p)
mid = (t[p].l + t[p].r) >> 1
ans = 0
if l <= mid:
ans += check(p*2, l, r)
if mid < r:
ans += check(p*2+1, l, r)
return ans
n, m = input().split()
n = int(n)
m = int(m)
x = input()
a[:] = [int(i) for i in x.split()]
build(1, 1, n)
for i in range(0, m):
x = input().split()
if x[0] == "1":
change(1, int(x[1]), int(x[2]), int(x[3]))
else:
print(check(1, int(x[1]), int(x[2])))