#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1919810],dp[1919810],dp_[1919810];
void build(int l,int r,int f)
{
if(l==r)
{dp[f]=a[l];return;}
int mid=l+r>>1;
build(l,mid,f<<1);
build(mid+1,r,f<<1|1);
dp[f]=dp[f<<1]+dp[f<<1|1];
}
int plus_(int l,int r,int start,int end,int f)
{
if(l<=start && r>=end)
return dp[f];
int mid=start+end>>1,ans=0;
if(dp_[f])
{
dp[f<<1]+=dp_[f]*(mid-start+1),dp[f<<1|1]+=dp_[f]*(end-mid);
dp_[f<<1]+=dp_[f],dp_[f<<1|1]+=dp_[f];
dp_[f]=0;
}
if(l<=mid) ans+=plus_(l,r,start,mid,f<<1);
if(r>mid) ans+=plus_(l,r,mid+1,end,f<<1|1);
return ans;
}
void update(int l,int r,int add,int start,int end,int f)
{
if(l<=start && end<=r)
{dp[f]+=(end-start+1)*add;dp_[f]+=add;return;}
int mid=start+end>>1;
if(dp_[f] && start!=end)
{
dp[f<<1]+=dp_[f]*(mid-start+1),dp[f<<1|1]+=dp_[f]*(end-mid);
dp_[f<<1]+=dp_[f],dp[f<<1|1]+=dp_[f];
dp_[f]=0;
}
if(l<=mid) update(l,r,add,start,mid,f<<1);
if(r>mid) update(l,r,add,mid+1,end,f<<1|1);
dp[f]=dp[f<<1]+dp[f<<1|1];
}
signed main()
{
int n,m;
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,n,1);
while(m--)
{
int op;
scanf("%lld",&op);
if(op==1)
{
int l,r,add;
scanf("%lld %lld %lld",&l,&r,&add);
update(l,r,add,1,n,1);
}
else
{
int l,r,add;
scanf("%lld %lld",&l,&r);
printf("%lld\n",plus_(l,r,1,n,1));
}
}
return 0;
}
如果发现错误,请告诉我在哪个函数里的,谢谢!(悬棺