Reply_ @ 2022-10-24 22:09:35
呜呜呜
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int l,r,sum,add;
}t[40100101];
int a[10000001];
inline void build(int li,int ri,int w)
{
t[w].l=li;
t[w].r=ri;
if(li==ri){
t[w].sum=a[li];
return;
}
int mid=(li+ri)>>1;
build(li,mid,2*w);
build(mid+1,ri,2*w+1);
t[w].sum=t[w*2].sum+t[w*2+1].sum;
return;
}
inline void push_down(int p)
{
if(t[p].add)
{
t[p*2].sum+=t[p].add*(t[p*2].r-t[p*2].l+1);
t[p*2+1].sum+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
t[p*2].add+t[p].add;
t[p*2+1].add+=t[p].add;
t[p].add=0;
}
}
inline void change(int li,int ri,int w,int ad)
{
if(li<=t[w].l && ri>=t[w].r)
{
t[w].sum+=ad*(t[w].r-t[w].l+1);
t[w].add+=ad;
return;
}
push_down(w);
int mid=t[w].l+t[w].r>>1,s=0;
if(li<=mid) change(li,ri,w*2,ad);
if(ri>mid) change(li,ri,w*2+1,ad);
return;
}
inline int find(int li,int ri,int w)
{
if(t[w].l>=li&&t[w].r<=ri)return t[w].sum;
push_down(w);
int mid=t[w].l+t[w].r>>1,s=0;
if(li<=mid) s+=find(li,mid,w*2);
if(ri>=mid) s+=find(mid+1,ri,w*2+1);
return s;
}
int main()
{
int n,m;
cin >> n>>m;
for(int i = 1;i<=n;i++) cin >> a[i];
build(1,n,1);
for(int i = 1;i<=m;i++)
{
int op;
cin >> op;
if(op==1)
{
int l,r,ad;
cin >> l >> r >>ad;
change(l,r,1,ad);
}
else
{
int l,r;
cin >> l >> r;
cout<<find(l,r,1);
}
}
return 0;
}
by Micnation_AFO @ 2022-10-24 22:10:51
@Chenyz
if(ri>=mid) s+=find(mid+1,ri,w*2+1);
不能取等