RT,代码如下:
#include<cstdio>
#define int long long
using namespace std;
const int N=1e6+5;
unsigned int n,m,a[N],ans[N<<2],tag[N<<2],x,y,k,op;
inline int read(){
int s=0,f=1;
char ch=getchar();
while(ch<'0' or ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' and ch<='9'){
s=(s<<1)+(s<<3)+(ch^48);
ch=getchar();
}
return f*s;
}
inline void build(int p,int l,int r){
tag[p]=0;
if(l==r){
ans[p]=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
ans[p]=ans[p<<1]+ans[p<<1|1];
}
inline void push_down(int p,int l,int r){
int mid=(l+r)>>1;
tag[p<<1]+=tag[p];
ans[p<<1]+=tag[p<<1]*(mid-l+1);
tag[p<<1|1]+=tag[p];
ans[p<<1|1]+=tag[p<<1|1]*(r-mid);
tag[p]=0;
}
inline void update(int x,int y,int l,int r,int p,int k){
if(x<=l and r<=y){
ans[p]+=k*(r-l+1);
tag[p]+=k;
return;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(x<=mid)update(x,y,l,mid,p<<1,k);
if(y>mid) update(x,y,mid+1,r,p<<1|1,k);
ans[p]=ans[p<<1]+ans[p<<1|1];
}
inline int query(int x,int y,int l,int r,int p){
int res=0;
if(x<=l and r<=y)return ans[p];
int mid=(l+r)>>1;
push_down(p,l,r);
if(x<=mid)res+=query(x,y,l,mid,p<<1);
if(y>mid) res+=query(x,y,mid+1,r,p<<1|1);
return res;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
build(1,1,n);
while(m--){
op=read();
if(op==1){
x=read(),y=read(),k=read();
update(x,y,1,n,1,k);
}
if(op==2){
x=read(),y=read();
printf("%lld\n",query(x,y,1,n,1));
}
}
return 0;
}