改不出来了,求助

P3372 【模板】线段树 1

@[aAsdfghjkl](/user/674419) 这边建议重构,错的实在是有点多,找个题解对一下吧。
by wl19lookdsb @ 2023-10-10 18:25:53


```cpp #include<bits/stdc++.h> #define N 400005 #define int long long using namespace std; long long f[N],sum[N],a1[N]; /*快读*/inline void read(long long &a) { int s=0,w=1; char ch=getchar(); while (ch<'0'||ch>'9') { if(ch=='-')w=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { s=s*10+ch-'0'; ch=getchar(); } a=s*w; } /*单点修改*/void change(int l,int r,int k) { if(l==r) { sum[k]=a1[l]; return ; } int mid=(l+r)>>1; change(l,mid,k*2); change(mid+1,r,k*2+1); sum[k]=sum[k*2]+sum[k*2+1]; } /*打标记*/void add(int l,int r,long long v,int k) { f[k]+=v; sum[k]+=(r-l+1)*v; //return ; } /*标记下传*/void down(int l,int r,int k,int mid,int v) { if(f[k]==0)return ; add(l,mid,f[k],k*2); add(mid+1,r,f[k],k*2+1); f[k]=0; } /*区间修改*/void xg(int x,int y,int l,int r,int k,int v) { if(x<=l&&r<=y) { add(l,r,v,k); return; } int mid=(l+r)>>1; down(l,r,k,mid,v); if(x<=mid)xg(x,y,l,mid,k*2,v); if(mid<y)xg(x,y,mid+1,r,k*2+1,v); sum[k]=sum[k*2]+sum[k*2+1]; } /*区间和*/int rr(int x,int y,int l,int r,int k) { if(x<=l&&r<=y)return sum[k]; int mid=(l+r)>>1,res=0; down(l,r,k,mid,f[k]); if(x<=mid)res+=rr(x,y,l,mid,k*2); if(mid<y)res+=rr(x,y,mid+1,r,k*2+1); return res; } signed main() { long long n,m; read(n); read(m); for(int i=1; i<=n; i++)scanf("%lld",&a1[i]); change(1,n,1); for(int i=1; i<=m; i++) { long long a,b,c,d; read(a); if(a==1) { read(d); read(b); read(c); xg(d,b,1,n,1,c); } else { read(c); read(b); cout<<rr(c,b,1,n,1)<<endl; } } return 0; }
by wl19lookdsb @ 2023-10-10 18:27:55


@[wl19lookdsb](/user/246992) 谢谢了
by aAsdfghjkl @ 2023-10-11 16:40:56


|