#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
int num;
int lid,rid;
int left,right;
int lan;
};
tree leaf[1000005];int cnt=0;
int a[100005];int n,m;
inline int build(int l,int r){
leaf[++cnt]={0,0,0,l,r,0};
int id=cnt;
if(l==r){leaf[id].num=a[l];return id;}
int mid=l+r>>1;
leaf[id].lid=build(l,mid);
leaf[id].rid=build(mid+1,r);
leaf[id].num=leaf[leaf[id].rid].num+leaf[leaf[id].lid].num;
return id;
}
inline int read(int x,int y,int id){
int ans=0;
if(leaf[id].left>=x and leaf[id].right<=y){
ans+=leaf[id].num;
if(leaf[id].lan){
if(leaf[id].left!=leaf[id].right){
leaf[leaf[id].lid].lan+=leaf[id].lan;
leaf[leaf[id].rid].lan+=leaf[id].lan;
}
leaf[id].lan=0;
}
return ans;
}
int mid=leaf[id].left+leaf[id].right>>1;
if(x<=mid)ans+=read(x,y,leaf[id].lid);
if(y>mid)ans+=read(x,y,leaf[id].rid);
return ans;
}
inline void update(int x,int y,int c,int id){
if(x<=leaf[id].left and y>=leaf[id].right){
leaf[id].lan+=c;
leaf[id].num+=(leaf[id].right-leaf[id].left+1)*leaf[id].lan;
return;
}
if(leaf[id].lan and leaf[id].left!=leaf[id].right){
leaf[leaf[id].lid].lan+=leaf[id].lan;
leaf[leaf[id].rid].lan+=leaf[id].lan;
leaf[id].lan=0;
}
int mid=leaf[id].left+leaf[id].right>>1;
if(x<=mid)update(x,y,c,leaf[id].lid);
if(y>mid)update(x,y,c,leaf[id].rid);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}build(1,n);
for(int i=1,t,x,y,k;i<=m;i++){
cin>>t>>x>>y;
if(t==1){
cin>>k;
update(x,y,k,1);
}
else if(t==2){
cout<<read(x,y,1)<<endl;
}
}
return 0;
}
样例也过不去 (前两问正确,最后一问输出12)