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 77 78 79 80 81 82 83 84 85 86 87
| #include<bits/stdc++.h> using namespace std; #define int unsigned long long const int MAXN=1e5; int n,m; int a[MAXN]; int val[(MAXN<<2)+10],tag[(MAXN<<2)+10],len[(MAXN<<2)+10]; int ls(int u){return u<<1;} int rs(int u){return u<<1|1;} void add_tag(int u,int v) { val[u]+=len[u]*v; tag[u]+=v; } void pushup(int id) { val[id]=val[ls(id)]+val[rs(id)]; } void pushdown(int u) { if(!tag[u])return ; add_tag(ls(u),tag[u]); add_tag(rs(u),tag[u]); tag[u]=0; } int read() { int x=0,f=1; char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();} return x*f; } void build(int u,int l,int r) { len[u]=r-l+1; if(l==r){val[u]=a[l];return;} int mid=l+((r-l)>>1); build(ls(u),l,mid),build(rs(u),mid+1,r); pushup(u); } void modify(int u,int ql,int qr,int l,int r,int v) { if(qr<l||r<ql)return ; if(ql<=l&&r<=qr){add_tag(u,v);return ;} int mid=l+((r-l)>>1); pushdown(u); modify(ls(u),ql,qr,l,mid,v),modify(rs(u),ql,qr,mid+1,r,v); pushup(u); } int query(int u,int ql,int qr,int l,int r) { if(qr<l||r<ql)return 0; if(ql<=l&&r<=qr)return val[u]; int mid=l+((r-l)>>1); pushdown(u); return query(ls(u),ql,qr,l,mid)+query(rs(u),ql,qr,mid+1,r); } signed main() { n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); build(1,1,n); while(m--) { int opt=read(); if(opt==1) { int l=read(),r=read(),v=read(); modify(1,l,r,1,n,v); } else { int l=read(),r=read(); cout<<query(1,l,r,1,n); puts(""); } } }
|