kb-07线段树-03--区间修改查询--lazy思想

  1 /*
  2    区间修改,区间查询和;
  3    第一次使用lazy思想;
  4    poj3468
  5  */
  6 #include<iostream>
  7 #include<cstdio>
  8 #include<cstring>
  9 #include<algorithm>
 10 #define ll long long
 11 using namespace std;
 12 typedef struct
 13 {
 14     int l,r;
 15     ll add;
 16     ll value;
 17 }V;
 18 
 19 int n,m,a[100005]={0};
 20 
 21 V tr[400010]={0};
 22 void Pushup(int rt)
 23 {
 24     tr[rt].value=tr[rt<<1].value+tr[(rt<<1)|1].value;
 25 }
 26 void Pushdown(int rt,int m)
 27 {
 28     if(tr[rt].add)
 29     {
 30         tr[rt<<1].add+=tr[rt].add;
 31         tr[(rt<<1)|1].add+=tr[rt].add;
 32         tr[rt<<1].value+=tr[rt].add*(m-(m>>1));
 33         tr[(rt<<1)|1].value+=tr[rt].add*(m>>1);
 34         tr[rt].add=0;
 35     }
 36 }
 37 void build(int i,int l,int r)
 38 {
 39     tr[i].l=l;
 40     tr[i].r=r;
 41     tr[i].add=0;
 42     if(l==r)
 43     {
 44         tr[i].value=a[l];
 45         return ;
 46     }
 47     int mid=(l+r)/2;
 48     build(i<<1,l,mid);
 49     build((i<<1)|1,mid+1,r);
 50     Pushup(i);
 51 }
 52 void Update(int i,int l,int r,int x)
 53 {
 54      if(tr[i].l==l&&tr[i].r==r)
 55      {
 56          tr[i].add+=x;
 57          tr[i].value+=(ll)x*(r-l+1);
 58          return ;
 59      }
 60      if(tr[i].l==tr[i].r)
 61          return ;
 62      Pushdown(i,tr[i].r-tr[i].l+1);
 63      int t=i<<1;
 64      if(l<=tr[t].r)
 65      {
 66          if(r<=tr[t].r)
 67              Update(t,l,r,x);
 68          else
 69              Update(t,l,tr[t].r,x);
 70      }
 71      t+=1;
 72      if(r>=tr[t].l)
 73      {
 74          if(l>=tr[t].l)
 75              Update(t,l,r,x);
 76          else
 77              Update(t,tr[t].l,r,x);
 78      }
 79      Pushup(i);
 80 }
 81 ll  Query(int i,int l,int r)
 82 {
 83     if(tr[i].l==l&&tr[i].r==r)
 84     {
 85         return tr[i].value;
 86     }
 87     Pushdown(i,tr[i].r-tr[i].l+1);
 88     ll ans=0;
 89     i=i<<1;
 90     if(l<=tr[i].r)
 91     {
 92         if(r<=tr[i].r)
 93             ans+=Query(i,l,r);
 94         else
 95             ans+=Query(i,l,tr[i].r);
 96     }
 97     i+=1;
 98     if(r>=tr[i].l)
 99     {
100         if(l>=tr[i].l)
101             ans+=Query(i,l,r);
102         else
103             ans+=Query(i,tr[i].l,r);
104     }
105     return ans;
106 }
107 int main()
108 {
109    while(scanf("%d%d",&n,&m)!=EOF)
110    {
111         memset(a,0,sizeof(a));
112         memset(tr,0,sizeof(tr));
113         for(int i=1;i<=n;i++)
114             scanf("%d",&a[i]);
115         build(1,1,n);
116         for(int i=0;i<m;i++)
117         {
118             char s[2];
119             int x1,x2,x3;
120             scanf("%s",s);
121             if(s[0]=='C')
122             {
123                 scanf("%d%d%d",&x1,&x2,&x3);
124                 Update(1,x1,x2,x3);
125             }
126             else
127             {
128                 scanf("%d%d",&x1,&x2);
129                 printf("%I64d\n",Query(1,x1,x2));
130             }
131         }
132    }
133     return 0;
134 }

 

posted on 2015-05-30 22:39  bai_yan  阅读(164)  评论(0编辑  收藏  举报

导航