区间修改,区间查询,求和
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 1e6+6; 7 #define LL long long 8 #define INF 0x7fffffff 9 10 int n,q,a[maxn]; 11 12 struct node{ 13 int l, r; 14 LL sum, lazy; 15 void update(int x) { 16 sum += 1LL*(r-l+1)*x; // 防止爆int 17 lazy += x; 18 } 19 }tree[maxn*4]; 20 21 void push_up(int x) { 22 tree[x].sum = tree[x<<1].sum + tree[x<<1|1].sum; 23 } 24 25 void push_down(int x) { 26 int lazy = tree[x].lazy; 27 if(lazy) { 28 tree[x<<1].update(lazy); 29 tree[x<<1|1].update(lazy); 30 tree[x].lazy = 0; 31 } 32 } 33 34 void build(int x, int l, int r) { 35 tree[x].l = l, tree[x].r = r; 36 tree[x].sum = tree[x].lazy = 0; 37 if(l == r) { 38 tree[x].sum = a[l]; 39 } 40 else { 41 int mid = (l+r) / 2; 42 build(x<<1, l, mid); 43 build(x<<1|1, mid+1, r); 44 push_up(x); 45 } 46 } 47 48 void update(int x, int l, int r, int val) { 49 int L = tree[x].l, R = tree[x].r; 50 if(l <= L && R <= r) { 51 tree[x].update(val); 52 } 53 else { 54 push_down(x); 55 int mid = (L+R) / 2; 56 if(mid >= l) update(x<<1, l, r, val); 57 if(r > mid) update(x<<1|1, l, r, val); 58 push_up(x); 59 } 60 } 61 62 LL query(int x, int l, int r) { 63 int L = tree[x].l, R = tree[x].r; 64 if(l <= L && R <= r) return tree[x].sum; 65 else { 66 push_down(x); 67 int mid = (L+R) / 2; 68 LL ans = 0; 69 if(mid >= l) ans += query(x<<1, l, r); 70 if(r > mid) ans += query(x<<1|1, l, r); 71 push_up(x); 72 return ans; 73 } 74 } 75 76 77 int main() { 78 scanf("%d",&n); 79 for(int i=1;i<=n;i++)a[i]=0; 80 build(1,1,n); 81 scanf("%d",&q); 82 for(int i=1;i<=q;i++) 83 { 84 int o,l,r,val; 85 scanf("%d%d%d%d",&o,&l,&r,&val); 86 if(o==0)update(1,l,r,val); 87 else printf("%lld ",query(1,l,r)); 88 } 89 return 0; 90 }