码风不太友善
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<functional>
//#define fIO
//#define Mul
//#define quickmode
#ifdef quickmode
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#endif
#define GC getchar()
#define _PC(a) putchar(a)
#define ll long long
#define __FREOPEN__(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
using namespace std;
bool _u(char c) {
return ((c<='9' && c>='0') || c=='-');
}
bool _d(char c) {
return (_u(c) || c=='.');
}
template <typename t> void double_read(t &a) {
a=0.;
int t1=1;
char c=GC;
while(!_d(c)) c=GC;
if(c=='-') t1=-1;
else if(c!='.') a=c-'0';
while((c=GC)!='.' && _u(c)) {
a=a*10.+c-'0';
}
double k=.1;
if(_d(c)) while(_u(c=GC)) a+=k*(c-'0'),k*=.1;
a*=t1;
}
template <typename t> void int_read(t &a) {
a=0;
int t1=1;
char c=GC;
while(!_u(c)) c=GC;
if(c=='-') t1=-1,c=GC;
a=(c-'0');
while(_u(c=GC)) a=a*10+(c-'0');
a*=t1;
}
/*template <typename t> void read(t &a) {
if(std::is_same<t,double>::value || std::is_same<t,float>::value) double_read(a);
else int_read(a);
}*/
template <typename t> void int_rwrite(t a) {
if(!a) return ;
int_rwrite(a/10);
_PC((a%10)+48);
}
template <typename t> void rwrite(t a) {
int_rwrite(a);
}
template <typename t> void write(t a) {
if(!a) _PC('0');
else if(a<0) _PC('-'),rwrite(-a);
else rwrite(a);
}
ll num[100005]={};
ll tree[3200005]={},tree2[3200005]={},tree3[3200005]={};
ll n,m,p;
void build(ll l,ll r,ll pt) {
if(l>r) return ;
if(l==r) {
tree[pt]=num[l];
return ;
}
ll mid=(l+r)>>1;
build(l,mid,pt<<1);
build(mid+1,r,(pt<<1)|1);
tree[pt]=tree[pt<<1]+tree[(pt<<1)|1];
}
ll get(ll l,ll r,ll l2,ll r2,ll pt) {
if(l2<=l && r<=r2) {
return tree[pt]+(r-l+1)*tree3[pt];
}
ll mid=(l+r)>>1;
ll ans=0;
tree3[pt<<1]+=tree3[pt];
tree3[(pt<<1)|1]+=tree3[pt];
if(l2<=mid) ans+=get(l,mid,l2,r2,pt<<1);
if(r2>mid) ans+=get(mid+1,r,l2,r2,(pt<<1)|1);
tree3[pt<<1]-=tree3[pt];
tree3[(pt<<1)|1]-=tree3[pt];
return ans;
}
void update_add(ll l,ll r,ll l2,ll r2,ll pt,ll adn) {
// write(l),_PC(32),write(r),_PC(10);
if(l2<=l && r<=r2) {
if(l!=r) tree3[pt]+=adn;
tree2[pt]=(r-l+1)*adn;
tree[pt]+=tree2[pt];
return ;
}
ll mid=(l+r)>>1;
tree2[pt<<1]=tree2[(pt<<1)|1]=0;
if(l2<=mid) update_add(l,mid,l2,r2,pt<<1,adn);
if(r2>mid) update_add(mid+1,r,l2,r2,(pt<<1)|1,adn);
tree2[pt]=tree2[pt<<1]+tree2[(pt<<1)|1];
tree[pt]+=tree2[pt];
}
void update_mul(ll l,ll r,ll l2,ll r2,ll pt,ll mtn) {
}
void wk() {
int_read(n),int_read(m);//,int_read(p);
for(ll i=1;i<=n;++i) int_read(num[i]);
build(1,n,1);
while(m--) {
ll ty;
int_read(ty);
if(ty==1) {
ll x,y,k;
int_read(x),int_read(y),int_read(k);
update_add(1,n,x,y,1,k);
}
else {
ll x,y;
int_read(x),int_read(y);
write(get(1,n,x,y,1)),_PC(10);
/*while(x<=y) {
write(get(1,n,x,x,1)),_PC(10);
++x;
}*/
}
}
}
signed main() {
#ifdef fIO
__FREOPEN__()
#endif
int t;
#ifdef Mul
int_read(t);
#else
t=1;
#endif
while(t--) wk();
}