模板:线段树(1)——加法,求和

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 }

猜你喜欢

转载自www.cnblogs.com/Aze-qwq/p/9337624.html