Advertisement
Guest User

Untitled

a guest
May 20th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <iostream>
  2. #define IO ios::sync_with_stdio(0);cin.tie(0)
  3. #define MAXN 100005
  4.  
  5. using namespace std;
  6.  
  7. struct ST {
  8.     long long val, tag;
  9. };
  10.  
  11. int N, Q;
  12. int in[MAXN];
  13. int a, b, c;
  14. char type;
  15. ST st[MAXN << 2];
  16.  
  17. void build(int, int, int);
  18. int query(int, int, int, int, int);
  19. void push(int, int, int);
  20. void modify(int, int, int, int, int, int);
  21.  
  22. signed main()
  23. {
  24.     IO;
  25.     cin >> N >> Q;
  26.     for (int i = 1; i <= N; i++)
  27.         cin >> in[i];
  28.     build(1, N, 1);
  29.     while (Q--) {
  30.         cin.ignore();
  31.         cin >> type;
  32.         if (type == 'Q') {
  33.             cin >> a >> b;
  34.             cout << query(1, N, a, b, 1) << endl;
  35.         }
  36.         else {
  37.             cin >> a >> b >> c;
  38.             modify(1, N, a, b, 1, c);
  39.         }
  40.     }
  41.     return 0;
  42. }
  43.  
  44. void build(int l, int r, int id)
  45. {
  46.     if (l == r) {
  47.         st[id].val = in[l];
  48.         return;
  49.     }
  50.     int m = (l + r) >> 1;
  51.     build(l, m, id << 1);
  52.     build(m + 1, r, id << 1 | 1);
  53.     st[id].val = st[id << 1].val + st[id << 1 | 1].val;
  54. }
  55.  
  56. int query(int l, int r, int L, int R, int id)
  57. {
  58.     if (st[id].tag)
  59.         push(l, r, id);
  60.     if (L <= l && r <= R)
  61.         return st[id].val;
  62.     if (r < L || R < l)
  63.         return 0;
  64.     int m = (l + r) >> 1;
  65.     return query(l, m, L, R, id << 1) + query(m + 1, r, L, R, id << 1 | 1);
  66. }
  67.  
  68. void push(int l, int r, int id)
  69. {
  70.     st[id].val += (r - l + 1) * st[id].tag;
  71.     st[id << 1].tag += st[id].tag;
  72.     st[id << 1 | 1].tag += st[id].tag;
  73.     st[id].tag = 0;
  74. }
  75.  
  76. void modify(int l, int r, int L, int R, int id, int val)
  77. {
  78.     if (L <= l && r <= R) {
  79.         st[id].tag += val;
  80.         return;
  81.     }
  82.     if (r < L || R < l)
  83.         return;
  84.     int m = (l + r) >> 1;
  85.     modify(l, m, L, R, id << 1, val);
  86.     modify(m + 1, r, L, R, id << 1 | 1, val);
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement