CODEVS1082 线段树练习3
Update 区间修改
Query 区间询问
1 #include <cstdio> 2 3 #define maxn 200008 4 #define lson l , m , rt << 1 5 #define rson m+1 , r , rt << 1 | 1 6 long long sum[maxn << 2],lazy[maxn << 2]; 7 int n; 8 9 void Pushup(int rt){ 10 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; 11 } 12 13 void Pushdown(int rt,int m){ 14 if (lazy[rt]) { 15 lazy[rt << 1] += lazy[rt]; 16 lazy[rt << 1 | 1] += lazy[rt]; 17 sum[rt << 1] += lazy[rt] * (m - m / 2); 18 sum[rt << 1 | 1] += lazy[rt] * (m / 2); 19 lazy[rt] = 0; 20 } 21 } 22 23 void Build(int l,int r,int rt){ 24 lazy[rt] = 0; 25 if (l==r) { 26 scanf("%d",&sum[rt]); 27 return; 28 } 29 int m = (l + r) >> 1; 30 Build(lson); 31 Build(rson); 32 Pushup(rt); 33 } 34 35 void Update(int L,int R,int val,int l,int r,int rt){ 36 if (L <= l && r <= R) { 37 sum[rt] += (r - l + 1) * val; 38 lazy[rt] += val; 39 return; 40 } 41 Pushdown(rt,r - l + 1); 42 int m = (l + r) >> 1; 43 if (L <= m) Update(L,R,val,lson); 44 if (m < R) Update(L,R,val,rson); 45 Pushup(rt); 46 } 47 48 long long Query(int L,int R,int l,int r,int rt){ 49 if (L <= l && r <= R) { 50 return sum[rt]; 51 } 52 Pushdown(rt,r - l + 1); 53 int m = (l + r) >> 1; 54 long long res = 0; 55 if (L <= m) res += Query(L,R,lson); 56 if (m < R) res += Query(L,R,rson); 57 return res; 58 } 59 60 int main() { 61 scanf("%d",&n); 62 Build(1,n,1); 63 int Q; 64 scanf("%d",&Q); 65 while (Q--) { 66 int x,y,z,w; 67 scanf("%d",&w); 68 if (w==1) { 69 scanf("%d%d%d",&x,&y,&z); 70 Update(x,y,z,1,n,1); 71 } 72 else { 73 scanf("%d%d",&x,&y); 74 printf("%I64d\n",Query(x,y,1,n,1)); 75 } 76 } 77 }

浙公网安备 33010602011771号