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 }