#include<bits/stdc++.h>
using namespace std;
template<typename T>
struct sequence{
private:
mt19937 random;
struct node{
T v,sum,tag;int s,p;node*l,*r;
void update(){
sum=v,s=1;
if(l)sum+=l->sum,s+=l->s;
if(r)sum+=r->sum,s+=r->s;
}void push(){
if(!tag)return;
if(l)l->tag+=tag,l->v+=tag,l->sum+=l->s*tag;
if(r)r->tag+=tag,r->v+=tag,r->sum+=r->s*tag;
tag=0,update();
}
}*root;
node*newnode(T v){
node*p=new node;p->v=v,p->sum=v,
p->tag=0,p->s=1,p->p=random(),
p->l=p->r=0;return p;
}void split(node*p,int k,node*&l,node*&r){
if(!p)return void(l=r=0);
p->push();int s=p->l?p->l->s:0;
if(s+1<=k)split(p->r,k-s-1,p->r,r),l=p;
else split(p->l,k,l,p->l),r=p;
p->update();
}node*merge(node*l,node*r){
if(!l||!r)return l?l:r;
l->push(),r->push();
if(l->p>r->p)return l->r=merge(l->r,r),l->update(),l;
return r->l=merge(l,r->l),r->update(),r;
}
public:
sequence():root(0),random(time(0)){}
void insert(int k,T v){
node*x,*y;split(root,k,x,y),
root=merge(merge(x,newnode(v)),y);
}void apply(int l,int r,T v){
node*x,*y,*z;split(root,r,y,z),
split(y,l-1,x,y),y->tag+=v,y->v+=v;
root=merge(merge(x,y),z);
}T prod(int l,int r){
node*x,*y,*z;split(root,r,y,z),
split(y,l-1,x,y);T res=y?y->sum:0;
root=merge(merge(x,y),z);return res;
}T operator[](int k){
node*x,*y,*p;split(root,k,x,y);
p=x;while(p&&p->r)p=p->r;
T res=p?p->v:0;root=merge(x,y);return res;
}
};sequence<int>a;
int n,m,t,x,y,k;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>x,a.insert(i,x);
for(int i=1;i<=m;i++){
cin>>t;
if(t==1)cin>>x>>y>>k,a.apply(x,y,k);
else cin>>x>>y,cout<<a.prod(x,y)<<'\n';
// for(int i=1;i<=n;i++)cout<<a[i]<<' ';cout<<'\n';
}
}
用Treap做的,估计是下传时出了问题