#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int sum[1000005*4];
int lazy[1000005*4];
int n,m;
void push_down(int rt,int l,int r)
{
if(lazy[rt]!=0)
{
int mid=(l+r)>>1;
lazy[2*rt]+=lazy[rt];
lazy[2*rt+1]+=lazy[rt];
sum[2*rt]+=(mid-l+1)*lazy[rt];
sum[2*rt+1]+=(r-mid)*lazy[rt];
lazy[rt]=0;
}
}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=a[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,2*rt);
build(mid+1,r,2*rt+1);
sum[rt]=sum[2*rt]+sum[2*rt+1];
return ;
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
return sum[rt];
push_down(rt,L,R);
int mid=(l+r)/2;
int ans=0;
if(L<=mid)
ans+=query(L,R,l,mid,2*rt);
if(R>mid)
ans+=query(L,R,mid+1,r,2*rt+1);
return ans;
}
void mo(int rt,int L,int R,int l,int r,int k)
{
if(L<=l&&r<=R)
{
sum[rt]+=(r-l+1)*k;
lazy[rt]+=k;
return ;
}
push_down(rt,l,r);
int mid=(l+r)/2;
if(L<=mid)
{
mo(2*rt,L,R,l,mid,k);
}
if(R>mid)
{
mo(2*rt+1,L,R,mid+1,r,k);
}
sum[rt]=sum[2*rt]+sum[2*rt+1];
return ;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
while(m--)
{
int op;
cin>>op;
if(op==1)
{
int a,b,c;
cin>>a>>b>>c;
mo(1,a,b,1,n,c);
}
else
{
int a,b;
cin>>a>>b;
cout<<query(a,b,1,n,1)<<endl;
}
}
return 0;
}
线段树模板
最新推荐文章于 2025-07-31 22:28:05 发布