题意:给定一串数字,进行两种固定操作:一,求某区间内的和;二对某区间内的所以数加上一指定数字。
水题
//4824 KB 2563 ms #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define ll long long #define M 100005 #define root 1,n,1 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; ll sum[M<<2],add[M<<2]; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushdown(int rt,int m) { if(!add[rt]) return; add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=add[rt]*(m-(m>>1)); sum[rt<<1|1]+=add[rt]*(m>>1); add[rt]=0; } void build(int l,int r,int rt) { add[rt]=0; if(l==r){ scanf("%I64d",&sum[rt]); return; } int m=(l+r)>>1; build(lson); build(rson); pushup(rt); } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R){ sum[rt]+=c*(r-l+1); add[rt]+=c; return; } pushdown(rt,r-l+1); int m=(l+r)>>1; if(L<=m) update(L,R,c,lson); if(R>m) update(L,R,c,rson); pushup(rt); } ll query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R){ return sum[rt]; } pushdown(rt,r-l+1); int m=(l+r)>>1; ll ans=0; if(L<=m) ans+=query(L,R,lson); if(R>m) ans+=query(L,R,rson); return ans; } int main() { int n,m; scanf("%d%d",&n,&m); build(root); while(m--){ char ch[5]; scanf("%s",ch); if(ch[0]=='C'){ int a,b,c; scanf("%d%d%d",&a,&b,&c); update(a,b,c,root); } else{ int a,b; scanf("%d%d",&a,&b); printf("%I64d\n",query(a,b,root)); } } return 0; }