from typing import List
from typing import Callable, Any
class SegTree:
class STNode:
def __init__(self,cl,cr,val=0) -> None:
self.cl,self.cr,self.val=cl,cr,val
self.left,self.right,self.lazy=None,None,0
def __init__(self,fr,to,cal:Callable[[int],Any]) -> None:
def dfs(root,fr,to):
root=self.STNode(fr,to)
if fr==to:
root.val=cal(fr)
else:
m=(fr+to)//2
root.left=dfs(root.left,fr,m)
root.right=dfs(root.right,m+1,to)
root.val=root.left.val+root.right.val
return root
self.root=dfs(None,fr,to)
def query(self,fr,to):
def dfs(root,fr,to):
if root.lazy!=0:
self.push_down(root)
if root.cl==fr and root.cr==to:
return root.val
cm=(root.cl+root.cr)//2
if to<=cm:
return dfs(root.left,fr,to)
elif fr>cm:
return dfs(root.right,fr,to)
else:
return dfs(root.left,fr,cm)+dfs(root.right,cm+1,to)
return dfs(self.root,fr,to)
def modify(self,fr,to,offset):
def dfs(root,fr,to):
if root.cl==fr and root.cr==to:
root.val+=(root.cr-root.cl+1)*offset
root.lazy+=offset
return
if root.lazy!=0:
self.push_down(root)
cm=(root.cl+root.cr)//2
if to<=cm:
dfs(root.left,fr,to)
elif fr>cm:
dfs(root.right,fr,to)
else:
dfs(root.left,fr,cm)
dfs(root.right,cm+1,to)
root.val=root.left.val+root.right.val
return dfs(self.root,fr,to)
def push_down(self,root:STNode):
if root.cl!=root.cr:
root.left.val+=(root.left.cr-root.left.cl+1)*root.lazy
root.right.val+=(root.right.cr-root.right.cl+1)*root.lazy
root.left.lazy+=root.lazy
root.right.lazy+=root.lazy
root.lazy=0
n,m=map(int,input().split())
init=list(map(int,input().split()))
sg=SegTree(1,n,lambda x:init[x-1])
for _ in range(m):
op,x,y,*v=map(int,input().split())
if op==1:
sg.modify(x,y,v[0])
else:
print(sg.query(x,y))