zjx011222_is_sb @ 2023-05-13 23:26:01
#include<iostream>
using namespace std;
int n,m;
struct info
{
int sum,l,r,tag;
} tre[200005];
int a[100005];
inline void pushup(int u)
{
tre[u].sum=tre[u<<1].sum+tre[u<<1|1].sum;
}
void build(int u,int l,int r)
{
tre[u].l=l;
tre[u].r=r;
if(l==r)
{
tre[u].sum=a[l];
return;
}
int mid=(r+l)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
inline void maketag(int u,int len,int k)
{
tre[u].tag+=k;
tre[u].sum+=k*len;
}
inline void pushdown(int u,int l,int r)
{
int mid=(l+r)>>1;
maketag(u<<1,mid-l+1,tre[u].tag);
maketag(u<<1|1,r-mid,tre[u].tag);
tre[u].tag=0;
}
inline void update(int u,int l,int r,int k)
{
if(tre[u].l>=l&&tre[u].r<=r)
{
maketag(u,r-l+1,k);
return;
}
pushdown(u,l,r);
int mid=(tre[u].l+tre[u].r)>>1;
if(l<=mid) update(u<<1,l,mid,k);
if(r>mid) update(u<<1|1,mid+1,r,k);
pushup(u);
}
int query(int u,int l,int r)
{
int res=0;
if((tre[u].l>=l)&&(tre[u].r<=r)) return tre[u].sum;
pushdown(u,l,r);
int mid=(tre[u].l+tre[u].r)>>1;
if(l<=mid) res+=query(u<<1,l,mid);
if(r>mid) res+=query(u<<1|1,mid+1,r);
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int opt,x,y,k;
cin>>opt;
if(opt==1)
{
cin>>x>>y>>k;
update(1,x,y,k);
}
else
{
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}