#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 100001
#define L(x) x*2
#define R(x) x*2+1
int n,m;
struct seg
{
int sum=0;
int inc=0;
};
int a[N];
seg tr[4*N];
inline void push_up(int x)
{
tr[x].sum=tr[L(x)].sum+tr[R(x)].sum;
return;
}
inline void build(int l,int r,int x)
{
if(l==r) {tr[x].sum=a[l];return;}
build(l,(l+r)/2,L(x));
build((l+r)/2+1,r,R(x));
push_up(x);
}
inline void f(int l,int r,int x,int k)
{
tr[x].inc+=k;
tr[x].sum+=k*(l-r+1);
}
inline void push_down(int l,int r,int x)
{
int mid=(l+r)/2;
f(l,mid,L(x),tr[x].inc);
f(mid+1,r,R(x),tr[x].inc);
tr[x].inc=0;
return;
}
inline void upd(int ll,int rr,int l,int r,int x,int k)
{
if(ll<=l && r<=rr)
{
f(l,r,x,k);
return;
}
push_down(l,r,x);
int mid=(l+r)/2;
if(ll<=mid) upd(ll,rr,l,mid,L(x),k);
if(rr>=mid+1) upd(ll,rr,mid+1,r,R(x),k);
push_up(x);
return;
}
inline int SUM(int ll,int rr,int l,int r,int x)
{
int ans=0;
if(ll<=l && r<=rr) return tr[x].sum;
push_down(l,r,x);
int mid=(l+r)/2;
if(ll<=mid) ans+=SUM(ll,rr,l,mid,L(x));
if(rr>=mid+1) ans+=SUM(ll,rr,mid+1,r,R(x));
push_up(x);
}
signed main()
{
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
int t,l,r,k;
while(m--)
{
cin>>t;
if(t==1)
{
cin>>l>>r>>k;
upd(l,r,1,n,1,k);
}
if(t==2)
{
cin>>l>>r;
cout<<SUM(l,r,1,n,1)<<endl;
}
}
system("pause");
return 0;
}
感觉甚至有点照着题解搞的,但是不知道错误是什么