#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m;
ll a[100005],tree[400005],tag[400005];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void build(int l,int r,int u){
if(l==r){tree[u]=a[l];return;}
int mid=l+r>>1;
build(l,mid,ls(u));
build(mid+1,r,rs(u));
tree[u]=tree[ls(u)]+tree[rs(u)];
}
inline void flag(int l,int r,int u,ll k){
tree[u]+=k*(r-l+1),tag[u]+=k;
}
inline void clear(int u,int l,int r){
if(l==r)return;
int mid=l+r>>1;
flag(l,mid,u,tag[u]);
flag(mid+1,r,u,tag[u]);
tag[u]=0;
}
inline void add(int tl,int tr,int l,int r,int u,ll k){
if(tl<=l&&tr>=r){
tree[u]+=k*(r-l+1),tag[u]+=k;
return;
}
clear(u,l,r);
int mid=l+r>>1;
if(tl<=mid)add(tl,tr,l,mid,ls(u),k);
if(tr>mid)add(tl,tr,mid+1,r,rs(u),k);
}
inline ll get(int tl,int tr,int l,int r,int u){
if(tl<=l&&tr>=r)return tree[u];
int mid=l+r>>1;
clear(u,l,r);
ll cnt=0;
if(tl<=mid)cnt+=get(tl,tr,l,mid,ls(u));
if(tr>mid)cnt+=get(tl,tr,mid+1,r,rs(u));
return cnt;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,n,1);
while(m--){
int op;
scanf("%d",&op);
if(op==1){
int x,y;ll k;
scanf("%d%d%lld",&x,&y,&k);
add(x,y,1,n,1,k);
}
else{
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",get(x,y,1,n,1));
}
}
}
我几乎都调成第一篇题解了,但是样例一的最后一个输出总是12