编辑
2025-08-30
XCPC
00
请注意,本文编写于 141 天前,最后修改于 141 天前,其中某些信息可能已经过时。
#include<bits/stdc++.h> using namespace std; #define int long long #define lc now<<1 #define rc now<<1|1 const int M=1e5+5; struct dian{ int l,r,sum,add; }f[M<<2|1]; int a[M]; void pushup(int now){ f[now].sum=f[lc].sum+f[rc].sum; } void build(int now,int l,int r){ f[now]={l,r,a[l],0}; if(l==r)return ; int mid=l+r>>1; build(lc,l,mid); build(rc,mid+1,r); pushup(now); } void pushdown(int now){ if(f[now].add){ f[lc].sum+=(f[lc].r-f[lc].l+1)*f[now].add; f[rc].sum+=(f[rc].r-f[rc].l+1)*f[now].add; f[lc].add+=f[now].add; f[rc].add+=f[now].add; f[now].add=0; } } void modi(int now,int x,int y,int k){ if(x<=f[now].l&&y>=f[now].r){ f[now].sum+=(f[now].r-f[now].l+1)*k; f[now].add+=k; return; } pushdown(now); int mid=f[now].l+f[now].r>>1; if(x<=mid)modi(lc,x,y,k); if(y>mid)modi(rc,x,y,k); pushup(now); } int que(int now,int x,int y){ if(x<=f[now].l&&y>=f[now].r) return f[now].sum; int mid=f[now].l+f[now].r>>1; pushdown(now); int sum=0; if(x<=mid)sum+=que(lc,x,y); if(y>mid)sum+=que(rc,x,y); return sum; } signed main(){ ios::sync_with_stdio(false),cin.tie(0); int n,m; cin>>n>>m; for(int i=1;i<=n;++i) cin>>a[i]; build(1,1,n); while(m--){ int op,x,y,k; cin>>op; if(op==1){ cin>>x>>y>>k; modi(1,x,y,k); } else { cin>>x>>y; cout<<que(1,x,y)<<'\n'; } } return 0; }
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay