板子都过不了我真的太菜了qwq
#include<iostream>
using namespace std;
long long tree[400010],lzt[400010],a[100010];
int n,m;
void build(int u,int l,int r)
{
if(l==r)
{
tree[u]=a[l];
return;
}
int mid=l+r>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
tree[u]=tree[u*2]+tree[u*2+1];
}
bool in(int l,int r,int x,int y)
{
return x<=l&&y>=r;
}
bool out(int l,int r,int x,int y)
{
return l>=y||r<=x;
}
void mt(int u,int l,int r,int k)
{
tree[u]+=(r-l+1)*k;
lzt[u]+=k;
}
void pd(int u,int l,int r)
{
if(!lzt[u])
return;
int mid=(l+r)>>1;
mt(u*2,l,mid,lzt[u]);
mt(u*2+1,mid+1,r,lzt[u]);
lzt[u]=0;
}
void add(int u,int l,int r,int x,int y,int k)
{
if(in(l,r,x,y))
{
tree[u]+=(r-l+1)*k;
lzt[u]+=k;
return;
}
pd(u,l,r);
if(out(l,r,x,y))
return;
int mid=l+r>>1;
add(u*2,l,mid,x,y,k);
add(u*2+1,mid+1,r,x,y,k);
tree[u]=tree[u*2]+tree[u*2+1];
}
int query(int u,int l,int r,int x,int y)
{
if(in(l,r,x,y))
return tree[u];
pd(u,l,r);
if(out(l,r,x,y))
return 0;
int mid=l+r>>1;
return query(u*2,l,mid,x,y)+query(u*2+1,mid+1,r,x,y);
}
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 op;
cin>>op;
if(op==1)
{
int x,y,k;
cin>>x>>y>>k;
add(1,1,n,x,y,k);
}
else
{
int x,y;
cin>>x>>y;
cout<<query(1,1,n,x,y)<<"\n";
}
}
}