rt,蒟蒻是全谷最水红
#include<bits/stdc++.h>
#define y1 qysghfjdsdfuifdgyu
using namespace std;
struct segTree{
#define l(x) ((x)<<1)
#define r(x) ((x)<<1|1)
struct node{
int ma,mi,sum,sumtag;
node(int a=0,int b=0,int c=0):ma(a),mi(b),sum(c){}
}tr[200005];
int n;
inline void pushup(int p){
tr[p].ma=max(tr[l(p)].ma,tr[r(p)].ma);
tr[p].mi=min(tr[l(p)].mi,tr[r(p)].mi);
tr[p].sum=tr[l(p)].sum+tr[l(p)].sum;
}
inline void pushdown(int p,int l,int r){
int mid=l+r>>1;
tr[l(p)].sumtag+=tr[p].sumtag;
tr[r(p)].sumtag+=tr[p].sumtag;
tr[l(p)].sum+=(mid-l+1)*tr[p].sumtag;
tr[r(p)].sum+=(r-mid)*tr[p].sumtag;
tr[p].sumtag=0;
}
void build(int R,int l,int r,int* a){
if(l==r)tr[R]={a[l],a[l],a[l]};
else{
int mid=l+r>>1;
build(l(R),l,mid,a);
build(r(R),mid+1,r,a);
pushup(R);
}
}
void update(int R,int ul,int ur,int l,int r,int val){
if(ul<=l&&ur>=r) tr[R].sumtag+=val,tr[R].sum+=(r-l+1)*val;
else{
int mid=l+r>>1;
pushdown(R,l,r);
update(l(R),ul,ur,l,mid,val);
update(r(R),ul,ur,mid+1,r,val);
}
}
node query(int R,int ql,int qr,int l,int r){
node ans={0,0,0},t;
if(ql<=l&&ql>=r)return tr[R];
int mid=l+r>>1;
if(ql<=mid){
t=query(l(R),ql,qr,l,mid);
ans={max(ans.ma,t.ma),min(ans.mi,t.mi),ans.sum+t.sum};
}
if(qr>mid){
t=query(r(R),ql,qr,mid+1,r);
ans={max(ans.ma,t.ma),min(ans.mi,t.mi),ans.sum+t.sum};
}
return ans;
}
inline void build(int _n,int* a){build(1,1,_n,a),n=_n;}
inline void update(int l,int r,int val){update(1,l,r,1,n,val);}
inline node query(int l,int r){return query(1,l,r,1,n);}
#undef l
#undef r
};
segTree t;
int a[100005];
int main(){
int n,q,op,l,r,x;
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
t.build(n,a);
while(q--){
cin>>op>>l>>r;
if(op==1)cin>>x,t.update(l,r,x);
else cout<<t.query(l,r).sum<<"\n";
}
}