//区间加,区间询问
//A Simple Problem with Integers
#include <bits/stdc++.h> #define int long long using namespace std; const int N=1e5+5; int n,m,x,y,v,now,cnt; int a[N],add[N*50],sum[N*50],lson[N*50],rson[N*50]; inline void pushdown(int k,int l,int r,int mid) { if (add[k]) { add[lson[k]]+=add[k]; sum[lson[k]]+=(mid-l+1)*add[k]; add[rson[k]]+=add[k]; sum[rson[k]]+=(r-(mid+1)+1)*add[k]; add[k]=0; } } void build(int k,int l,int r) { if (l==r) {sum[k]=a[l]; return;} if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; build(lson[k],l,mid); build(rson[k],mid+1,r); sum[k]=sum[lson[k]]+sum[rson[k]]; } void change(int k,int l,int r,int qx,int qy,int v) { if (qx<=l && r<=qy) { add[k]+=v; sum[k]+=(r-l+1)*v; return; } if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; pushdown(k,l,r,mid); if (qx<=mid) change(lson[k],l,mid,qx,qy,v); if (mid<qy) change(rson[k],mid+1,r,qx,qy,v); sum[k]=sum[lson[k]]+sum[rson[k]]; } int query(int k,int l,int r,int qx,int qy) { if (qx<=l && r<=qy) return sum[k]; if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; pushdown(k,l,r,mid); int ans=0; if (qx<=mid) ans+=query(lson[k],l,mid,qx,qy); if (mid<y) ans+=query(rson[k],mid+1,r,qx,qy); return ans; } signed main(){ scanf("%lld%lld",&n,&m); cnt=1; for (register int i=1; i<=n; ++i) scanf("%lld",&a[i]); build(1,1,n); for (register int i=1; i<=m; ++i) { char kk; cin>>kk; // scanf("%lld",&now); if (kk=='C') { scanf("%lld%lld%lld",&x,&y,&v); change(1,1,n,x,y,v); } else { scanf("%lld%lld",&x,&y); printf("%lld ",query(1,1,n,x,y)); } } return 0; }
//zz https://blog.csdn.net/u012972031/article/details/88751811
//https://www.luogu.org/problemnew/show/P3372
#include<cstdio> #include<iostream> using namespace std; const int N=300010; struct node{ int ls,rs,lazy; long long sum; }tr[N]; int root=0,cnt=0; void insert(int &root,int l,int r,int ll,int rr,int x) { if(!root) root=++cnt; int b=min(r,rr)-max(l,ll)+1; tr[root].sum+=b*x; if(l>=ll&&r<=rr) { tr[root].lazy+=x; return; } int mid=l+r>>1; if(ll<=mid) insert(tr[root].ls,l,mid,ll,rr,x); if(rr>mid) insert(tr[root].rs,mid+1,r,ll,rr,x); } long long query(int root,int l,int r,int ll,int rr) { if(l>=ll&&r<=rr) return tr[root].sum; int mid=l+r>>1; if(tr[root].lazy) { if(!tr[root].ls) tr[root].ls=++cnt; tr[tr[root].ls].lazy+=tr[root].lazy; tr[tr[root].ls].sum+=tr[root].lazy*(mid-l+1); if(!tr[root].rs) tr[root].rs=++cnt; tr[tr[root].rs].lazy+=tr[root].lazy; tr[tr[root].rs].sum+=tr[root].lazy*(r-mid); tr[root].lazy=0; } long long ans=0; if(ll<=mid) ans+=query(tr[root].ls,l,mid,ll,rr); if(rr>mid) ans+=query(tr[root].rs,mid+1,r,ll,rr); return ans; } int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { int temp; cin>>temp; insert(root,1,n,i,i,temp); } for(int i=1;i<=m;i++) { int ta,tb,tc,td; cin>>ta>>tb>>tc; if(ta==1) { cin>>td; insert(root,1,n,tb,tc,td); } else if(ta==2) { cout<<query(root,1,n,tb,tc)<<endl; } } return 0; }
//区间赋值,区间询问 //https://www.luogu.com.cn/problem/CF915E #include <bits/stdc++.h> using namespace std; const int N=3e5+5; int n,q,cnt,l,r,v; int sum[N*50],tag[N*50],lson[N*50],rson[N*50]; inline void pushdown(int k,int l,int r,int mid) { if (~tag[k]) { sum[lson[k]]=(mid-l+1)*tag[k]; sum[rson[k]]=(r-(mid+1)+1)*tag[k]; tag[lson[k]]=tag[rson[k]]=tag[k]; tag[k]=-1; } } void change(int k,int l,int r,int qx,int qy,int v) { if (qx<=l && r<=qy) { tag[k]=v; sum[k]=(r-l+1)*v; return; } if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; pushdown(k,l,r,mid); if (qx<=mid) change(lson[k],l,mid,qx,qy,v); if (mid<qy) change(rson[k],mid+1,r,qx,qy,v); sum[k]=sum[lson[k]]+sum[rson[k]]; } int main(){ memset(tag,-1,sizeof(tag)); scanf("%d",&n); scanf("%d",&q); cnt=1; while (q--) { scanf("%d%d%d",&l,&r,&v); v&=1; if (l>r) swap(l,r); change(1,1,n,l,r,v); printf("%d ",n-sum[1]); } return 0; } //https://blog.csdn.net/Dove_xyh/article/details/103019813