#include<iostream>
using namespace std;
long long a[100002],tree[400009],ans,tag[400009];
void pushup(int x)
{
tree[x]=tree[x<<1]+tree[x<<1|1];
}
void build(int x,int l,int r)
{
if(l==r){
tree[x]=a[l];
return;
}
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
void pushdown(int x,int l,int r)
{
int ll=x<<1,rr=x<<1|1,mid=(l+r)>>1;
tag[ll]+=tag[x];
tree[ll]+=tag[x]*(mid-l+1);
tag[rr]+=tag[x];
tree[rr]+=tag[x]*(r-mid);
tag[x]=0;
}
void query(int x,int l,int r,int L,int R)
{
if(l>R||r<L) return;
if(L<=l&&r<=R)
{
ans+=tree[x];
return;
}
int mid=(l+r)>>1;
pushdown(x,l,r);
query(x<<1,l,mid,L,R);
query(x<<1|1,mid+1,r,L,R);
}
void update(int x,int l,int r,int L,int R,int k)
{
if (R<l||r<L) return ;
if(L<=l&&r<=R){
tree[x]+=k*(r-l+1);
tag[x]+=k;
return;
}
int mid=(l+r)>>1;
pushdown(x,l,r);
update(x<<1,l,mid,L,R,k);
update(x<<1|1,mid+1,r,L,R,k);
pushup(x);
}
int main()
{
int n,m,tmp,tmpl,tmpr,k;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>tmp;
if(tmp==1)
{
cin>>tmpl>>tmpr>>k;
update(1,1,n,tmpl,tmpr,k);
}
else{
ans=0;
cin>>tmpl>>tmpr;
query(1,1,n,tmpl,tmpr);
cout<<ans<<endl;
}
}
return 0;
}
线段树
最新推荐文章于 2022-01-29 02:12:59 发布