用的分块,不知道为啥过不了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=100005;
int n,m,x,y,opt,w,k;
int a[maxn],l[maxn],r[maxn],pos[maxn],add[maxn],sum[maxn];
int tj(int x,int y){
int p=pos[x],q=pos[y],ans=0;
if(p==q){
for(int i=x;i<=y;i++) ans+=a[i]+add[q];
return ans;
}
for(int i=p+1;i<=q-1;i++){
ans+=sum[i];
}
for(int i=x;i<=r[p];i++){
ans+=a[i]+add[p];
}
for(int i=l[q];i<=y;i++){
ans+=a[i]+add[q];
}
return ans;
}
void addm(int x,int y,int v){
int p=pos[x],q=pos[y];
if(p==q){
for(int i=x;i<=y;i++) a[i]+=v;
sum[p]+=(y-x+1)*v;
return ;
}
for(int i=p+1;i<=q-1;i++){
add[i]+=v;
sum[i]+=(r[i]-l[i]+1)*v;
}
for(int i=x;i<=r[p];i++) a[i]+=v;
sum[p]+=(r[p]-x+1)*v;
for(int i=l[q];i<=y;i++) a[i]+=v;
sum[q]+=(y-l[q]+1)*v;
return ;
}
signed main(){
cin>>n>>m;
int t=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=t;i++){
l[i]=(i-1)*t+1;r[i]=i*t;
for(int j=l[i];j<=r[i];j++){
pos[j]=i;
}
}
if(r[t]<n){
t++;
l[t]=r[t-1]+1;r[t]=n;
for(int i=l[t];i<=r[t];i++) pos[i]=t;
}
while(m--){
cin>>opt>>x>>y;
if(opt==1){
cin>>k;
addm(x,y,k);
}else{
cout<<tj(x,y)<<endl;
}
}
return 0;
}