rt,code:
#include<iostream>
#define int long long
using namespace std;
const int N=1e6+5;
int n,m;
int a[N];
struct node{
int l,r,s,la,max;
}t[N*4];
inline void pushup(int i){
int ls=i*2,rs=i*2+1;
t[i].s=t[ls].s+t[rs].s;
return ;
}
inline void pushdown(int i){
int ls=i*2,rs=i*2+1;
t[ls].s+=t[i].s*(t[ls].r-t[ls].l+1);
t[rs].s+=t[i].s*(t[rs].r-t[rs].l+1);
t[ls].la+=t[i].la;
t[rs].la+=t[i].la;
t[i].la=0;
return ;
}
inline void build(int i,int l,int r){
int ls=i*2,rs=i*2+1;
int mid=(l+r)>>1;
t[i].l=l,t[i].r=r;
if(l==r){
t[i].s=a[l];
return ;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(i);
return ;
}
inline void update(int i,int l,int r,int k){
int ls=i*2,rs=i*2+1;
int mid=(t[i].l+t[i].r)>>1;
if(l<=t[i].l&&r>=t[i].r){
t[i].s+=k*(t[i].r-t[i].l+1);
t[i].la+=k;
return ;
}
pushdown(i);
if(l<=mid)update(ls,l,r,k);
if(r>mid)update(rs,l,r,k);
pushup(i);
return ;
}
inline int query(int i,int l,int r){
int ls=i*2,rs=i*2+1;
int s=0,mid=(t[i].l+t[i].r)>>1;
if(l<=t[i].l&&r>=t[i].r)return t[i].s;
pushdown(i);
if(l<=mid)s+=query(ls,l,r);
if(r>mid)s+=query(rs,l,r);
return s;
}
inline void work(){
int op,x,y;
cin>>op>>x>>y;
if(op==1){
int k;
cin>>k;
update(1,x,y,k);
}else if(op==2){
cout<<query(1,x,y)<<"\n";
}
return ;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--)work();
return 0;
}