//树状数组
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,w;
int m[N];
int lowbit(int x)
{
return x&(-x);
}
int add(int x,int v)
{
for(int i=x;i<=n;i+=lowbit(i))
{
m[i]+=v;
}
}
int query(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
res+=m[i];
return res;
}
int main()
{
cin>>n>>w;
for(int i=1,temp;i<=n;i++)
{
cin>>temp;
add(i,temp);
}
while(w--)
{
int k,x,y;
cin>>k>>x>>y;
if(k==0)
cout<<query(y)-query(x-1)<<endl;
else add(x,y);
}
}
//线段树
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int value[N],tree[N*4],mark[N*4];
void push_up(int node)
{
tree[node]=tree[node*2+0]+tree[node*2+1];
}
void push_down(int node,int length)
{
mark[node*2+0]+=mark[node];
mark[node*2+1]+=mark[node];
tree[node*2+0]+=mark[node]*(length-length/2);
tree[node*2+1]+=mark[node]*(length/2);
mark[node]=0;
}
void build(int node,int left,int right)
{
if(left==right)
{
tree[node]=value[left];
}
else
{
int mid=(left+right)/2;
build(node*2+0,left,mid);
build(node*2+1,mid+1,right);
push_up(node);
}
}
void update(int node,int left,int right,int start,int end,int n)
{
if(end<left||right<start)
return;
else if(start<=left&&right<=end)
{
tree[node]+=(right-left+1)*n;
if(right>left)
mark[node]+=n;
}
else
{
push_down(node,right-left+1);
int mid=(left+right)/2;
update(node*2+0,left,mid,start,end,n);
update(node*2+1,mid+1,right,start,end,n);
push_up(node);
}
}
int query(int node,int left,int right,int start,int end)
{
if(end<left||right<start)
return 0;
else if(start<=left&&right<=end)
return tree[node];
else
{
int mid=(left+right)/2;
push_down(node,right-left+1);
return query(node*2+0,left,mid,start,end)+query(node*2+1,mid+1,right,start,end);
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>value[i];
build(1,1,n);
for(int i=0;i<m;i++)
{
int num,x,y,k;
cin>>num;
if(num==1)
{
cin>>x>>y>>k;
update(1,1,n,x,y,k);
}
else
{
cin>>x>>y;
cout<<query(1,1,n,x,y)<<endl;
}
}
}