1 struct pointtype 2 { 3 long long sum; 4 long long lazy; 5 }tree[500001]; 6 void push_up(int root) 7 { 8 tree[root].sum=tree[root*2].sum+tree[root*2+1].sum; 9 return; 10 } 11 void push_down(int root,int l,int r) 12 { 13 int len=r-l+1; 14 tree[root*2].sum+=tree[root].lazy*(len-len/2); 15 tree[root*2].lazy+=tree[root].lazy; 16 tree[root*2+1].sum+=tree[root].lazy*(len/2); 17 tree[root*2+1].lazy+=tree[root].lazy; 18 tree[root].lazy=0; 19 return; 20 } 21 void build(int root,int l,int r) 22 { 23 if(l==r) 24 { 25 scanf("%lld",&tree[root].sum); 26 return; 27 } 28 tree[root].lazy=0; 29 build(root*2,l,(l+r)/2); 30 build(root*2+1,(l+r)/2+1,r); 31 push_up(root); 32 return; 33 } 34 void update_point(int root,int l,int r,int pos,int delta) 35 { 36 if(l==r) 37 { 38 tree[root].sum+=delta; 39 return; 40 } 41 if(pos<=(l+r)/2) 42 { 43 update_point(root*2,l,(l+r)/2,pos,delta); 44 } 45 else 46 { 47 update_point(root*2+1,(l+r)/2+1,r,pos,delta); 48 } 49 push_up(root); 50 return; 51 } 52 int query_point(int root,int l,int r,int pos) 53 { 54 if(l==r) 55 { 56 return tree[root].sum; 57 } 58 int ans=0; 59 if(pos<=(l+r)/2) 60 { 61 ans+=query_point(root*2,l,(l+r)/2,pos); 62 } 63 if(pos>(l+r)/2) 64 { 65 ans+=query_point(root*2+1,(l+r)/2+1,r,pos); 66 } 67 return ans; 68 } 69 void update_seq(int root,int l,int r,int L,int R,int delta) 70 { 71 if(L<=l&&r<=R) 72 { 73 tree[root].sum+=delta*(r-l+1); 74 tree[root].lazy+=delta; 75 return; 76 } 77 if(tree[root].lazy) 78 { 79 push_down(root,l,r); 80 } 81 if(L<=(l+r)/2) 82 { 83 update_seq(root*2,l,(l+r)/2,L,R,delta); 84 } 85 if((l+r)/2<R) 86 { 87 update_seq(root*2+1,(l+r)/2+1,r,L,R,delta); 88 } 89 push_up(root); 90 return; 91 } 92 long long query_seq(int root,int l,int r,int L,int R) 93 { 94 if(L<=l&&r<=R) 95 { 96 return tree[root].sum; 97 } 98 long long ans=0; 99 push_down(root,l,r); 100 if(L<=(l+r)/2) 101 { 102 ans+=query_seq(root*2,l,(l+r)/2,L,R); 103 } 104 if((l+r)/2<R) 105 { 106 ans+=query_seq(root*2+1,(l+r)/2+1,r,L,R); 107 } 108 push_up(root); 109 return ans; 110 }