#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<string> using namespace std; typedef long long ll; const double PI=acos(-1.0); const double EXP=1e-8; int nn,m; int a[100010]; ll node[100010*4]; ll sum[100010*4]; void build(int l,int r,int n) { if(l==r) { node[n]=a[l]; return; } int mid=(l+r)/2; build(l,mid,n*2); build(mid+1,r,n*2+1); node[n]=node[n*2]+node[n*2+1]; } void pushdown(int n,int k) { if(sum[n]) { sum[n*2]+=sum[n]; sum[n*2+1]+=sum[n]; node[n*2]+=sum[n]*(k-(k>>1)); node[n*2+1]+=sum[n]*(k>>1); sum[n]=0; } } void update(int p,int q,int l,int r,int n,int x) { if(p<=l&&q>=r) { sum[n]+=x; node[n]+=x*(r-l+1); return; } pushdown(n,r-l+1); int mid=(l+r)/2; if(p<=mid) update(p,q,l,mid,n*2,x); if(q>mid) update(p,q,mid+1,r,n*2+1,x); node[n]=node[n*2]+node[n*2+1]; } ll query(int p,int q,int l,int r,int n) { if(p<=l&&q>=r) return node[n]; pushdown(n,r-l+1); int mid=(l+r)/2; ll res=0; if(p<=mid) res+=query(p,q,l,mid,n*2); if(q>mid) res+=query(p,q,mid+1,r,n*2+1); return res; } int main() { while(scanf("%d%d",&nn,&m)!=EOF) { memset(sum,0,sizeof(sum)); for(int i=1;i<=nn;i++) scanf("%d",&a[i]); build(1,nn,1); while(m--) { char s[10]; int a,b; scanf("%s%d%d",s,&a,&b); if(s[0]=='Q') { printf("%lld\n",query(a,b,1,nn,1)); } else { int c; scanf("%d",&c); update(a,b,1,nn,1,c); } } } return 0; }
线段树区间更新
最新推荐文章于 2018-06-07 23:25:09 发布