#include<bits/stdc++.h>
#define maxn 100005
#define left o*2
#define right o*2+1
#define int long long
using namespace std;
int addv[maxn*4],sumv[maxn*4],a[maxn];
void build(int o,int l,int r)
{
if(l==r)
{
sumv[o]=a[l];
return;
}
else
{
int mid=l+(r-l)/2;
build(left,l,mid);
build(right,mid+1,r);
sumv[o]=sumv[left]+sumv[right];
}
}
void pushdown(int o,int l,int r)
{
if(addv[o]==0)
{
return;
}
else
{
int mid=(l+r)/2;
addv[left]+=addv[o];
sumv[left]+=addv[o]*(mid-l+1);
addv[right]+=addv[o];
sumv[right]+=addv[o]*(r-mid);
addv[o]=0;
}
}
int pl,pr,v;
void update(int o,int l,int r)
{
if (pl<=l&&r<=pr)
{
addv[o]+=v;
sumv[o]+=v*(r-l+1);
return;
}
else
{
pushdown(o,l,r);
int mid=l+(r-l)/2;
if(pl<=mid)
{
update(left,l,mid);
}
if(mid<pr)
{
update(right,mid+1,r);
}
sumv[o]=sumv[left]+sumv[right];
}
}
int pll,prr;
int query(int o,int l,int r)
{
if(pll<=l&&r<=prr)
{
return sumv[o];
}
else
{
int mid=l+(r-l)/2,ans=0;
pushdown(o,l,r);
if(pll<=mid)
{
ans+=query(left,l,mid);
}
if(mid<prr)
{
ans+=query(right,mid+1,r);
}
return ans;
}
}
//void output(int o,int l,int r)
//{
// if(l==r)
// {
// cout<<sumv[o]<<" ";
// }
// else
// {
// int mid=(l+r)/2;
// output(left,l,mid);
// output(right,mid+1,r);
// }
//}
signed main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
build(1,1,n);
for(int i=0;i<m;++i)
{
int op;
cin>>op;
if(op==1)
{
cin>>pl>>pr>>v;
update(1,1,n);
}
else if(op==2)
{
cin>>pll>>prr;
cout<<query(1,1,n)<<endl;
}
}
}
存个板子供自己和大家参考