zMinYu @ 2023-04-12 10:17:37
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
struct node
{
ll l,r;
ll num;
}tr[N*4];
ll a[N],lazy[N*4];
void pushup(ll u)
{
tr[u].num=tr[u*2].num+tr[u*2+1].num;
}
void build(ll u,ll l,ll r)
{
if(l==r)
{
tr[u].num=a[l];
tr[u].l=l;
tr[u].r=r;
}
else
{
tr[u].l=l;
tr[u].r=r;
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
}
//点修改
//void modify(int u,int l,int r,int x,int k) //将编号为x的值加k
//{
// if(l==r)
// {
// tr[u].num=tr[u].num+k;
// }
// else
// {
// int mid=(l+r)/2;
// if(x<=mid) modify(u*2,l,mid,x,k);
// if(x>mid) modify(u*2,mid+1,r,x,k);
// pushup(u);
// }
//}
void pushdown(ll u,ll ln,ll rn)
{
if(lazy[u])
{
lazy[u*2]+=lazy[u];
lazy[u*2+1]+=lazy[u];
tr[u*2].num+=lazy[u]*ln;
tr[u*2+1].num+=lazy[u]*rn;
lazy[u]=0;
}
}
void modify(ll u,ll L,ll R,ll k)
{
if(tr[u].l>=L&&tr[u].r<=R)
{
tr[u].num+=(tr[u].r-tr[u].l+1)*k;
lazy[u]+=k;
}
else
{
ll mid=(tr[u].l+tr[u].r)/2;
pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
if(L<=mid) modify(u*2,L,R,k);
if(R>mid) modify(u*2+1,L,R,k);
pushup(u);
}
}
int query(ll u,ll L,ll R)
{
if(tr[u].l>=L&&tr[u].r<=R)
{
return tr[u].num;
}
ll mid=(tr[u].l+tr[u].r)/2;
ll ans=0;
if(L<=mid) ans+=query(u*2,L,R);
if(R>mid) ans+=query(u*2+1,L,R);
return ans;
}
int main()
{
ll n,m;cin>>n>>m;
for(ll i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
ll op,x,y,k;
while(m--)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
modify(1,x,y,k);
}
else if(op==2)
{
cin>>x>>y;
cout<<query(1,x,y)<<"\n";
}
}
return 0;
}
by windows_fleon @ 2023-04-12 10:29:07
抓住一颗彩球!
by 听取MLE声一片 @ 2023-04-12 13:01:44
@jiuchaozhiyuan query 没 pushdown。
建议优化写法。
by zMinYu @ 2023-04-13 09:37:45
@听取MLE声一片 谢谢啊