#include<cstdio> #define lson n<<1,l,mid #define rson (n<<1)|1,mid+1,r #define gmid (a[n].l+a[n].r)>>1 using namespace std; const int MAX_N=100005; typedef long long LL; struct node{ int l,r; LL sum,lazy; }a[MAX_N<<2]; void PushUp(int n) { a[n].sum=a[n<<1].sum+a[(n<<1)|1].sum; } void PushDown(int n) { int mid =gmid; a[n<<1].sum+=a[n].lazy*(LL)(mid-a[n].l+1); a[(n<<1)|1].sum+=a[n].lazy*(LL)(a[n].r-mid); a[n<<1].lazy+=a[n].lazy; a[(n<<1)|1].lazy+=a[n].lazy; a[n].lazy=0; } void Build(int n,int l,int r) { a[n].l=l; a[n].r=r; if(l==r) { scanf("%lld",&a[n].sum); a[n].lazy=0; return ; } int mid=gmid; Build(lson); Build(rson); PushUp(n); } void Update(int n,int l,int r,int val) { if(a[n].l==l&&a[n].r==r) { a[n].lazy+=val; a[n].sum+=val*(LL)(r-l+1); return ; } int mid=gmid; if(a[n].lazy) PushDown(n); if(r<=mid) Update(n<<1,l,r,val); else if(mid<l) Update((n<<1)|1,l,r,val); else{ Update(lson,val); Update(rson,val); } PushUp(n); } LL Query(int n,int l,int r) { if(a[n].l==l&&a[n].r==r) { return a[n].sum; } int mid=gmid; if(a[n].lazy) PushDown(n); if(r<=mid) return Query(n<<1,l,r); else if(mid<l) return Query((n<<1)|1,l,r); else return Query(lson)+Query(rson); } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { Build(1,1,n); while(m--) { scanf("%*c"); char op; scanf("%c",&op); if(op==‘Q‘) { int x,y; scanf("%d%d",&x,&y); printf("%lld\n",Query(1,x,y)); } else { int x,y,v; scanf("%d%d%d",&x,&y,&v); Update(1,x,y,v); } } } return 0; }
时间: 2024-10-24 10:37:52