#include#include using namespace std;const int maxx=100010;int n,m,a[maxx],add[maxx*4];long long sum[maxx*4];void build(int k,int l,int r){ if(l==r) { sum[k]=a[l]; return; } int mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); sum[k]=sum[k<<1]+sum[k<<1|1];}void Add(int k,int l,int r,int v){ add[k]+=v; sum[k]+=(long long)v*(r-l+1);}void pushdown(int k,int l,int r,int mid){ if(add[k]==0) return; Add(k<<1,l,mid,add[k]); Add(k<<1|1,mid+1,r,add[k]); add[k]=0;}long long query(int k,int l,int r,int x,int y){ if(l>=x&&r<=y) return sum[k]; int mid=(l+r)>>1; long long res=0; pushdown(k,l,r,mid); if(x<=mid) res+=query(k<<1,l,mid,x,y); if(mid =x&&r<=y) return Add(k,l,r,v); int mid=(l+r)>>1; pushdown(k,l,r,mid); if(x<=mid) modify(k<<1,l,mid,x,y,v); if(mid >n>>m; for(i=1;i<=n;i++) cin>>a[i]; build(1,1,n); while(m--) { int qwq,start,end,f; cin>>qwq; if(qwq==1) { cin>>start>>end>>f; modify(1,1,n,start,end,f); } if(qwq==2) { cin>>start>>end; long long ans=query(1,1,n,start,end); printf("%lld\n",ans); } } return 0;}
背下来(