大 红 大 黑
#include<iostream>
#define int long long
using namespace std;
int tree[2000005],lazy_tag[2000005],a[500005];
void push_down(int s,int i)//标记下传
{
if(s>1)
{
lazy_tag[i*2]+=lazy_tag[i];
lazy_tag[i*2+1]+=lazy_tag[i];
}
tree[i]+=lazy_tag[i]*s;
lazy_tag[i]=0;
}
int build(int l,int r,int i)//建树
{
if(l==r)
{
tree[i]=a[l];
return a[l];
}
int mid=(l+r)/2;
tree[i]=build(l,mid,i*2)+build(mid+1,r,i*2+1);
return tree[i];
}
int find(int l,int r,int ll,int rr,int i)//区间和
{
push_down(l-r+1,i);
if(rr<l||r<ll)
{
return 0;
}
if(ll<=l&&r<=rr)
{
return tree[i];
}
int mid=(l+r)/2;
return find(l,mid,ll,rr,i*2)+find(mid+1,r,ll,rr,i*2+1);
}
void add(int l,int r,int ll,int rr,int i,int s)//区间修改
{
push_down(r-l+1,i);
if(rr<l||r<ll)
{
return;
}
if(ll<=l&&r<=rr)
{
lazy_tag[i]+=s;
push_down(r-l+1,i);
}
if(l!=r)
{
int mid=(l+r)/2;
add(l,mid,ll,rr,i*2,s);
add(mid+1,r,ll,rr,i*2+1,s);
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
while(m--)
{
int a,l,r,k;
cin>>a;
if(a==1)
{
cin>>l>>r>>k;
add(1,n,l,r,1,k);
}
else
{
cin>>l>>r;
cout<<find(1,n,l,r,1)<<endl;
}
}
return 0;
}