#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,a[100005],c,op1,op2,op3,s[100005],del[100005];
struct node
{
ll l,r;
}tr[1000100];
void pushup(ll u)
{
s[u]=s[u<<1]+s[u<<1|1];
}
void pushdown(ll u,ll l,ll r)
{
if(del[u])
{
ll mid=l+r>>1;
s[u<<1]=s[u<<1]+(mid-l+1)*del[u];
s[u<<1|1]=s[u<<1|1]+(r-mid)*del[u];
del[u<<1]+=del[u];
del[u<<1|1]+=del[u];
del[u]=0;
}
}
void build(ll u,ll l,ll r)
{
tr[u].l=l;
tr[u].r=r;
if(l==r)
{
s[u]=a[l];
return;
}
ll mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify(ll u,ll x,ll y,ll v)
{
ll l=tr[u].l,r=tr[u].r;
if(x<=l && r<=y)
{
s[u]=s[u]+(r-l+1)*v;
del[u]+=v;
pushdown(u,l,r);
return;
}
ll mid=l+r>>1;
if(x<=mid) modify(u<<1,x,y,v);
if(y>mid) modify(u<<1|1,x,y,v);
pushup(u);
}
ll getsum(ll u,ll x,ll y)
{
ll l=tr[u].l,r=tr[u].r;
if(x<=l && r<=y) return s[u];
ll mid=l+r>>1,sum=0;
if(x<=mid) sum+=getsum(u<<1,x,y);
if(y>mid) sum+=getsum(u<<1|1,x,y);
return sum;
}
int main()
{
cin>>n>>m;
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,1,n);
for(ll i=1;i<=m;i++)
{
cin>>c;
if(c==1)
{
scanf("%lld%lld%lld",&op1,&op2,&op3);
modify(1,op1,op2,op3);
}
else
{
scanf("%lld%lld",&op1,&op2);
printf("%lld\n",getsum(1,op1,op2));
}
}
return 0;
}
改了一下午从0分改到了20分,细节出现了问题,蒟蒻求助!谢谢各位大佬们