HELP! ! !

P3372 【模板】线段树 1

``` #include<bits/stdc++.h> #define mid (l+r)/2 using namespace std; struct hop{ int r,l;long long num; };hop tree[400001]; int tag[400000]; int n,m; void pushup(int root){ tree[root].num=tree[root*2].num+tree[root*2+1].num; } void build(int l,int r,int root){ tag[root]=0; if(l==r){ cin>>tree[root].num; tree[root].l=l; tree[root].r=r;return;} build(l,mid,root*2); build(mid+1,r,root*2+1); pushup(root); } void pushdown(int m,int root){ if(tag[root]){ tree[root*2].num+=(m-m/2)*tag[root]; tree[root*2+1].num+=(m/2)*tag[root]; tag[root*2]+=tag[root]; tag[root*2+1]+=tag[root];tag[root]=0;} } void update(int a,int b,int root,long long p,int l,int r){ if(a<=l&&b>=r){ tree[root].num+=(r-l+1)*p; tag[root]+=p;return ; } int m=r-l+1; pushdown(m,root); if(a<=(r+l)/2){ update(a,b,root*2,p,l,(r+l)/2);//[Error] reference to 'update' is ambiguous } if(b>(r+l)/2){ update(a,b,root*2+1,p,(r+l)/2+1,r); } pushup(root); } long long query(int l,int r,int root,int a,int b){ if(a>=l&&b<=r){ return tree[root].num; } m=r-l+1; pushdown(m,root); long long ans=0; if(a<=(l+r)/2)ans+=query(l,mid,root*2,a,b);if(b>(l+r)/2)ans+=query(mid+1,r,root*2+1,a,b); return ans; } int main(){ int n,m; cin>>m>>n; build(1,m,1); for(int i=1;i<=n;i++){ int k; cin>>k; if(k==1){ int a,b;long long c; update(a,b,1,c,1,m); } else { int a,b; cin>>a>>b; cout<<query(1,m,1,a,b)<<endl; } } return 0; } ``` ## 这回编成RE了...
by Comintern @ 2021-07-28 17:53:02


|