main.cc 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <cstdio>
  2. using namespace std;
  3. const int N = 1000000;
  4. struct TNode {
  5. long long val;
  6. long long inc;
  7. int beg;
  8. int end;
  9. TNode *l;
  10. TNode *r;
  11. int mid() { return beg + (end - beg) / 2; }
  12. };
  13. TNode tree[2 * N];
  14. int tid = 0;
  15. TNode *build_tree(TNode *root, int beg, int end) {
  16. root->beg = beg;
  17. root->end = end;
  18. root->val = 0;
  19. root->inc = 0;
  20. if (beg != end) {
  21. root->l = build_tree(&tree[tid++], beg, root->mid());
  22. root->r = build_tree(&tree[tid++], root->mid() + 1, end);
  23. }
  24. return root;
  25. }
  26. void update(TNode *root, int beg, int end, long long inc) {
  27. if (root->beg == beg && root->end == end) {
  28. root->inc += inc;
  29. return;
  30. }
  31. root->val += inc * (end - beg + 1);
  32. if (root->mid() < beg) return update(root->r, beg, end, inc);
  33. if (end <= root->mid()) return update(root->l, beg, end, inc);
  34. update(root->l, beg, root->mid(), inc);
  35. update(root->r, root->mid() + 1, end, inc);
  36. }
  37. long long query(TNode *root, int beg, int end) {
  38. if (beg == root->beg && end == root->end)
  39. return root->inc * (end - beg + 1) + root->val;
  40. if (root->inc != 0) {
  41. root->val += root->inc * (root->end - root->beg + 1);
  42. update(root->l, root->beg, root->mid(), root->inc);
  43. update(root->r, root->mid() + 1, root->end, root->inc);
  44. }
  45. root->inc = 0;
  46. if (root->mid() < beg) return query(root->r, beg, end);
  47. if (end <= root->mid()) return query(root->l, beg, end);
  48. return query(root->l, beg, root->mid()) +
  49. query(root->r, root->mid() + 1, end);
  50. }
  51. int main() {
  52. int n, q;
  53. scanf("%d %d", &n, &q);
  54. TNode *root = &tree[tid++];
  55. build_tree(root, 1, n);
  56. for (int i = 1, v; i <= n; i++) {
  57. scanf("%d", &v);
  58. update(root, i, i, v);
  59. }
  60. char op[2];
  61. for (int i = 0, a, b, c; i < q; i++) {
  62. scanf("%s", op);
  63. if (op[0] == 'C') {
  64. scanf("%d %d %d", &a, &b, &c);
  65. update(root, a, b, c);
  66. } else {
  67. scanf("%d %d", &a, &b);
  68. printf("%lld\n", query(root, a, b));
  69. }
  70. }
  71. return 0;
  72. }