1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include<stdio.h> #define maxn 100005 long long a[maxn]={0}; struct node{ long long val; long long addmk; }; struct node segtree[4*maxn+1];
void build(int rt,int st,int ed){ segtree[rt].addmk=0; if(st==ed) segtree[rt].val=a[st]; else{ int mid=(st+ed)/2; build(rt*2,st,mid); build(rt*2+1,mid+1,ed); segtree[rt].val=segtree[rt*2].val+segtree[rt*2+1].val; } }
void pushdown(int rt,int st,int ed){ if(segtree[rt].addmk!=0){ segtree[rt*2].addmk+=segtree[rt].addmk; segtree[rt*2+1].addmk+=segtree[rt].addmk; int mid=(st+ed)/2; segtree[rt*2].val+=segtree[rt].addmk*(mid-st+1); segtree[rt*2+1].val+=segtree[rt].addmk*(ed-mid); segtree[rt].addmk=0; } }
long long query(int rt,int nst,int ned,int qst,int qed){ if(qst>ned||qed<nst) return 0; if(qst<=nst&&qed>=ned) return segtree[rt].val; pushdown(rt,nst,ned); int mid=(nst+ned)/2; return query(rt*2,nst,mid,qst,qed)+query(rt*2+1,mid+1,ned,qst,qed); }
void update(int rt,int nst,int ned,int ust,int ued,int addval){ if(ust>ned||ued<nst) return; if(ust<=nst&&ued>=ned){ segtree[rt].addmk+=addval; segtree[rt].val+=addval*(ned-nst+1); return; } pushdown(rt,nst,ned); int mid=(nst+ned)/2; update(rt*2,nst,mid,ust,ued,addval); update(rt*2+1,mid+1,ned,ust,ued,addval); segtree[rt].val=segtree[rt*2].val+segtree[rt*2+1].val; }
int main(){ int n,m,i,j,type,x,y,k; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,1,n); for(i=1;i<=m;i++){ scanf("%d",&type); if(type==1){ scanf("%d%d%d",&x,&y,&k); update(1,1,n,x,y,k); } else{ scanf("%d%d",&x,&y); printf("%lld\n",query(1,1,n,x,y)); } } return 0; }
|