#include<bits/stdc++.h>
#define L p<<1
#define R p<<1|1
#define int long long
using namespace std;
const int N=1000025;
int a[N];
struct st{
int l;
int r;
int p;
int dis;
}t[N<<2];
inline void build(int l,int r,int p){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].p=a[l];
return;
}
int mid = (l+r)>>1;
build (l,mid,L);
build (mid+1,r,R);
t[p].p = t[L].p+t[R].p;
}
inline void push_down(int p){
if(t[p].dis!=0){
t[L].p+=t[p].dis*(t[L].r-t[L].l+1);
t[L].dis+=t[p].dis;
t[R].p+=t[p].dis*(t[R].r-t[R].l+1);
t[R].dis+=t[p].dis;
}
}
inline void update(int l,int r,int p,int k){
if(l<=t[p].l&&t[p].r<=r){
t[p].p+=k*(t[p].r-t[p].l+1);
t[p].dis+=k;
return;
}
push_down(p);
int mid = (t[p].l+t[p].r)>>1;
if(l<=mid) update(l,mid,L,k);
if(r>mid) update(mid+1,r,R,k);
t[p].p=t[L].p+t[R].p;
}
inline int query(int l,int r,int p){
if(l<=t[p].l&&t[p].r<=r)
return t[p].p;
push_down(p);
int mid = (t[p].l+t[p].r)>>1;
int ans = 0;
if(l<=mid) ans+=query(l,r,L);
if(r>mid) ans+=query(l,r,R);
return ans;
}
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);
for(int i=1;i<=m;i++)
{
int Q,l,r,k;
scanf("%lld",&Q);
if(Q==1){
scanf("%lld%lld%lld",&l,&r,&k);
update(l,r,1,k);
}
else{
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(l,r,1));
}
}
return 0;
}
代码如上,能过样例但是一交就全WA qwq