#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct stree{
ll l,r;
ll num;
ll lazy;
};
stree tr[100005*4];
ll a[100005];
void pushup(ll u)
{
tr[u].num=tr[u*2].num+tr[u*2+1].num;
}
void build(ll u,ll l,ll r)
{
tr[u].l=l;
tr[u].r=r;
if(l==r)
{
tr[u].num=a[l];
return;
}
ll mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void pushdown(ll u)
{
tr[u*2].lazy=tr[u].lazy;
tr[u*2+1].lazy=tr[u].lazy;
tr[u*2].num+=(tr[u*2].r-tr[u*2].l+1)*tr[u].lazy;
tr[u*2+1].num+=(tr[u*2+1].r-tr[u*2+1].l+1)*tr[u+1].lazy;
}
int xw(ll u,ll L,ll R)
{
if(tr[u].l>=L&&tr[u].r<=R)
{
return tr[u].num;
}
ll mid=(tr[u].l+tr[u].r)/2;
ll res=0;
pushdown(u);
if(mid>=L) res+=xw(u*2,L,R);
if(mid<R) res+=xw(u*2+1,L,R);
return res;
}
void md(ll u,ll L,ll R,ll x)
{
if(tr[u].l>=L&&tr[u].r<=R)
{
tr[u].lazy+=x;
tr[u].num+=(tr[u].r-tr[u].l+1)*x;
return;
}
ll mid=(tr[u].l+tr[u].r)/2;
if(mid>=L) md(u*2,L,R,x);
if(mid<R) md(u*2+1,L,R,x);
pushup(u);
}
int main()
{
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
ll opt,x,y,k;
while(m--)
{
cin>>opt;
if(opt==1)
{
cin>>x>>y>>k;
md(1,x,y,k);
}
else{
cin>>x>>y;
cout<<xw(1,x,y)<<endl;
}
}
}
萌新第一次打线段树,就爆0了