Poj 3468 线段树 lazy

女爷i 2022-06-14 04:10 311阅读 0赞
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<stack>
  5. #include<vector>
  6. #include<queue>
  7. #include<algorithm>
  8. #include<map>
  9. #define lson l, mid, rt<<1
  10. #define rson mid+1, r, rt<<1 | 1
  11. using namespace std;
  12. typedef long long LL;
  13. const int maxn = 100000+10;
  14. LL add[maxn<<2];
  15. LL sum[maxn<<2];
  16. struct tree {
  17. int l, r;
  18. int mid() {
  19. return (l+r)>>1;
  20. }
  21. }tr[maxn<<2];
  22. void pushup(int rt) {
  23. sum[rt] = sum[rt<<1]+sum[rt<<1|1];
  24. }
  25. void pushdown(int rt, int m) {
  26. if (add[rt]) {
  27. add[rt<<1] += add[rt];
  28. add[rt<<1|1] += add[rt];
  29. sum[rt<<1] += 1LL*add[rt]*(m-(m>>1));
  30. sum[rt<<1|1] += 1LL*add[rt]*(m>>1);
  31. add[rt] = 0;
  32. }
  33. }
  34. void build(int l, int r, int rt) {
  35. tr[rt].l = l;
  36. tr[rt].r = r;
  37. add[rt] = 0;
  38. if (l == r) {
  39. scanf("%lld", &sum[rt]);
  40. return ;
  41. }
  42. int mid = tr[rt].mid();
  43. build(lson);
  44. build(rson);
  45. pushup(rt);
  46. }
  47. void update(int c, int l, int r, int rt) {
  48. if (tr[rt].l == l && tr[rt].r == r) {
  49. add[rt] += c;
  50. sum[rt] += 1LL*c*(r-l+1);
  51. return ;
  52. }
  53. if (tr[rt].l == tr[rt].r)
  54. return ;
  55. pushdown(rt, tr[rt].r-tr[rt].l+1);
  56. int mid = tr[rt].mid();
  57. if (r<=mid)
  58. update(c, l, r, rt<<1);
  59. else if (l > mid)
  60. update(c, l, r, rt<<1|1);
  61. else {
  62. update(c, lson);
  63. update(c, rson);
  64. }
  65. pushup(rt);
  66. }
  67. LL query(int l, int r, int rt) {
  68. if (l == tr[rt].l && tr[rt].r == r) {
  69. return sum[rt];
  70. }
  71. pushdown(rt, tr[rt].r-tr[rt].l+1);
  72. int mid = tr[rt].mid();
  73. LL res = 0;
  74. if (r <= mid)
  75. res += query(l, r, rt<<1);
  76. else if (l > mid)
  77. res += query(l, r, rt<<1|1);
  78. else {
  79. res += query(lson);
  80. res += query(rson);
  81. }
  82. return res;
  83. }
  84. int main() {
  85. int n, q;
  86. while(~scanf("%d%d", &n, &q)) {
  87. build(1, n, 1);
  88. char ch[2];
  89. while (q--) {
  90. scanf("%s", ch);
  91. if (ch[0] == 'C') {
  92. int l, r, c;
  93. scanf("%d%d%d", &l, &r, &c);
  94. update(c, l, r, 1);
  95. }
  96. else {
  97. int l, r;
  98. scanf("%d%d", &l, &r);
  99. printf("%lld\n", query(l, r, 1));
  100. }
  101. }
  102. }
  103. return 0;
  104. }

发表评论

表情:
评论列表 (有 0 条评论,311人围观)

还没有评论,来说两句吧...

相关阅读