https://www.luogu.org/problemnew/show/P3372
1 #include<iostream> 2 #include<cstdio> 3 #define INF 99999999 4 #define ls (root<<1) 5 #define rs (root<<1|1) 6 using namespace std; 7 typedef long long ll; 8 struct node{ 9 ll val; 10 ll len; 11 ll lazy; 12 ll l, r; 13 }tree[300005]; 14 ll a[100005]; 15 ll n, m; 16 int kd(){ 17 int r=0, f=1; 18 char c=getchar(); 19 while(c<'0'||c>'9'){ 20 if(c=='-') f=-1; 21 c=getchar(); 22 } 23 while(c>='0'&&c<='9'){ 24 r=(r<<1)+(r<<3)+c-'0'; 25 c=getchar(); 26 } 27 return f*r; 28 } 29 void build(ll root, ll l, ll r){ 30 ll mid; 31 tree[root].lazy=0; 32 tree[root].l=l; 33 tree[root].r=r; 34 tree[root].len=r-l+1; 35 if(l==r) tree[root].val=a[l]; 36 else{ 37 mid=(l+r)/2; 38 build(ls, l, mid); 39 build(rs, mid+1, r); 40 tree[root].val=tree[ls].val+tree[rs].val; 41 } 42 } 43 void pushdown(ll root){ 44 if(tree[root].lazy){ 45 tree[ls].lazy+=tree[root].lazy; 46 tree[rs].lazy+=tree[root].lazy; 47 tree[ls].val+=tree[ls].len*tree[root].lazy; 48 tree[rs].val+=tree[rs].len*tree[root].lazy; 49 tree[root].lazy=0; 50 } 51 } 52 void add(ll root,ll id,ll addv){ 53 ll mid; 54 if(tree[root].l==tree[root].r){ 55 tree[root].val+=addv; 56 return; 57 } 58 else{ 59 mid=(tree[root].l+tree[root].r)/2; 60 if(id<=mid) add(ls,id,addv); 61 else add(rs,id,addv); 62 tree[root].val=tree[ls].val+tree[rs].val; 63 } 64 } 65 ll query(ll root,ll l,ll r){ 66 ll mid; 67 if(tree[root].l>=l && tree[root].r<=r) return tree[root].val; 68 if(tree[root].l>r || tree[root].r<l) return 0; 69 if(tree[root].lazy) pushdown(root); 70 return query(ls, l, r)+query(rs, l, r); 71 } 72 void update(ll root,ll l,ll r,ll addv){ 73 ll mid; 74 if(tree[root].l>=l && tree[root].r<=r){ 75 tree[root].lazy+=addv; 76 tree[root].val+=tree[root].len*addv; 77 return; 78 } 79 if(tree[root].l>r || tree[root].r<l) return; 80 if(tree[root].lazy) pushdown(root); 81 update(ls, l, r,addv); 82 update(rs, l, r, addv); 83 tree[root].val=tree[ls].val+tree[rs].val; 84 } 85 int main(){ 86 ll i, x, y, k; 87 char z; 88 n=kd(); 89 m=kd(); 90 for(i=1; i<=n; i++){ 91 a[i]=kd(); 92 } 93 build(1, 1, n); 94 for(i=1; i<=m; i++){ 95 cin>>z; 96 if(z=='1'){ 97 x=kd(); 98 y=kd(); 99 k=kd(); 100 update(1,x,y,k); 101 } 102 else{ 103 x=kd(); 104 y=kd(); 105 printf("%lld\n",query(1,x,y)); 106 } 107 } 108 return 0; 109 }