RT。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=4e5+5;
int n,q,a[maxn];
struct tree{
int l,r,pre,tag;
}t[maxn];
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
void pushdown(int p){
int l=ls(p),r=rs(p);
if(t[p].tag){
t[l].tag+=t[p].tag;
t[l].pre+=t[p].tag*(t[l].r-t[l].l+1);
t[r].tag+=t[p].tag;
t[r].pre+=t[p].tag*(t[r].r-t[r].l+1);
t[p].tag=0;
}
}
void update(int p){
int l=ls(p),r=rs(p);
t[p].pre=t[l].pre+t[r].pre;
}
void build(int p,int l,int r){
t[p].l=l;t[p].r=r;
if(l==r){
t[p].pre=a[p];
return;
}
int mid=l+r>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
update(p);
}
void modify(int p,int l,int r,int lx,int rx,int pre){
if(l>=lx&&r<=rx){
t[p].tag+=pre;
t[p].pre+=pre*(t[p].r-t[p].l+1);
return;
}
int mid=l+r>>1;
pushdown(p);
if(rx<=mid) modify(ls(p),l,mid,lx,rx,pre);
else if(lx>mid) modify(rs(p),mid+1,r,lx,rx,pre);
else{
modify(ls(p),l,mid,lx,mid,pre);
modify(rs(p),mid+1,r,mid+1,rx,pre);
}
update(p);
}
int query(int p,int l,int r,int lx,int rx){
if(l>=lx&&r<=rx) return t[p].pre;
int mid=l+r>>1;
pushdown(p);
if(rx<=mid) return query(ls(p),l,mid,lx,rx);
else if(lx>mid) return query(rs(p),mid+1,r,lx,rx);
return query(ls(p),l,mid,lx,mid)+query(rs(p),mid+1,r,mid+1,rx);
}
signed main(){
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]);
build(1,1,n);
while(q--){
int op,l,r,x;
scanf("%lld%lld%lld",&op,&l,&r);
if(op==1){
scanf("%lld",&x);
modify(1,1,n,l,r,x);
}
else
printf("%lld\n",query(1,1,n,l,r));
}
return 0;
}