分块写炸了,只对了前七个点,求助!
#include<bits/stdc++.h>
#define maxn 100005
#define B 305
using namespace std;
int n,m,a[maxn];
int sum[B],lazy[B];
void add(int l,int r,int v){
int L=(l-1)/B+1,R=(r-1)/B+1;
for(int i=L+1;i<=R-1;i++){
lazy[i]+=v,sum[i]+=v*B;
}
for(int i=l;i<=min(r,L*B);i++)
a[i]+=v,sum[L]+=v;
if(L!=R){
for(int i=(R-1)*B+1;i<=r;i++)
a[i]+=v,sum[R]+=v;
}
}
void ask(int l,int r){
int L=(l-1)/B+1,R=(r-1)/B+1,ans=0;
for(int i=L+1;i<=R-1;i++){
ans+=sum[i];
}
for(int i=l;i<=min(r,L*B);i++)
ans+=a[i]+lazy[L];
if(L!=R){
for(int i=(R-1)*B+1;i<=r;i++)
ans+=a[i]+lazy[R];
}
cout<<ans<<endl;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;;i++){
for(int j=(i-1)*B+1;j<=i*B;j++){
sum[i]+=a[j];
}
if(i*B>=n)break;
}
for(int i=1;i<=m;i++){
int opt,l,r,v;
cin>>opt>>l>>r;
if(opt==1)cin>>v,add(l,r,v);
else ask(l,r);
}
return 0;
}