#include<bits/stdc++.h>
using namespace std;
long long a[10005];
struct tree{
long long l,r,sc,la;
}t[450005];
void build(long long p,long long l,long long r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].sc=a[l];
return;
}
build(p*2,l,(l+r)>>1);
build(p*2+1,((l+r)>>1)+1,r);
t[p].sc=t[p*2].sc+t[p*2+1].sc;
}
void spread(long long p){
if(t[p].la){
t[p*2].sc+=t[p].la*(t[p*2].r-t[p*2].l+1);
t[p*2+1].sc+=t[p].la*(t[p*2+1].r-t[p*2+1].l+1);
t[p*2].la+=t[p].la;
t[p*2+1].la+=t[p].la;
t[p].la=0;
}
}
void change(long long p,long long l,long long r,long long k){
if(l<=t[p].l&&t[p].r<=r){
t[p].sc+=k*(t[p].r-t[p].l+1);
t[p].la+=k;
return;
}
spread(p);
if(l<=((t[p].l+t[p].r)>>1))change(p*2,l,r,k);
if(r>((t[p].l+t[p].r)>>1))change(p*2+1,l,r,k);
t[p].sc=t[p*2].sc+t[p*2+1].sc;
}
long long print(long long p,long long l,long long r){
if(l<=t[p].l&&t[p].r<=r)return t[p].sc;
spread(p);
long long ans=0;
if(l<=((t[p].l+t[p].r)>>1))ans+=print(p*2,l,r);
if(r>((t[p].l+t[p].r)>>1))ans+=print(p*2+1,l,r);
return ans;
}
int main(){
long long m,n;
scanf("%lld %lld",&n,&m);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
for(long long i=1;i<=m;i++){
long long xx;
scanf("%lld",&xx);
if(xx==1){
long long x,y,z;
scanf("%lld %lld %lld",&x,&y,&z);
change(1,x,y,z);
}
else{
long long x,y;
scanf("%lld %lld",&x,&y);
printf("%lld\n",print(1,x,y));
}
}
return 0;
}
看着题解现学,历经九九八十一难结果发现最后三个点WA了 /ng