#include<cstdio> #include<algorithm> using namespace std; int m, n, k, q, w; long long e; struct p{ int l,r; long long sum, seg; }s[800001]; void tui(int ro, int l, int r) { int mid=(l+r)/2; s[ro*2].seg+=s[ro].seg; s[ro*2].sum+=s[ro].seg*(mid-l+1); s[ro*2+1].seg+=s[ro].seg; s[ro*2+1].sum+=s[ro].seg*(r-(mid+1)+1); s[ro].seg=0; } void bu(int ro, int l, int r) { s[ro].l=l; s[ro].r=r; int mid=(l+r)/2; if(l==r){ scanf("%d", &s[ro].sum); return ; } bu(ro*2,l,mid); bu(ro*2+1,mid+1,r); s[ro].sum=s[ro*2].sum+s[ro*2+1].sum; } long long he(int ro, int l, int r) { if(r>=s[ro].r&&l<=s[ro].l) return s[ro].sum; int mid=(s[ro].l+s[ro].r)/2; if(s[ro].seg!=0){ tui(ro,s[ro].l, s[ro].r); } if(l>mid) return he(ro*2+1,l,r); else if(r<=mid) return he(ro*2,l,r); return he(ro*2,l,mid)+he(ro*2+1,mid+1,r); } void geng(int d, int l, int r) { if(q<=l&&w>=r) { s[d].seg+=e; s[d].sum+=(r-l+1)*e; return; } if(s[d].seg!=0){ tui(d,s[d].l, s[d].r); } int mid=(l+r)/2; if(q<=mid) geng(d*2,l,mid); if(w>mid) geng(d*2+1,mid+1,r); s[d].sum=s[d*2].sum+s[d*2+1].sum; } int main() { scanf("%d", &m); bu(1,1,m); scanf("%d", &n); for(int i=1;i<=n;i++) { scanf("%d", &k); if(k==1) { scanf("%d %d %d", &q, &w, &e); geng(1,1,m); } else { scanf("%d %d", &q, &w); printf("%lld\n", he(1,q,w)); } } return 0; }
codevs线段树练习3
最新推荐文章于 2018-07-24 18:28:54 发布