Advertisement
999ms

Untitled

Jul 7th, 2019
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. template<typename T>
  2. class TSegmentTree {
  3. public:
  4.     TSegmentTree(size_t size, T zeroValue)
  5.         : Size_(size)
  6.         , ZeroValue_(zeroValue)
  7.     {
  8.         Tree_.assign(size * 4, ZeroValue_);
  9.     }  
  10.  
  11.     void update(size_t v, size_t tl, size_t tr, size_t i, T value) {
  12.         if (tl >= r || tr <= l) {
  13.             return;
  14.         }
  15.         if (tl >= l && tr <= r) {
  16.             t[v] += value;
  17.         } else {
  18.             size_t tm = (tl + tr) / 2;
  19.             if (i < tm) {
  20.                 update(v * 2 + 1, tl, tm, i, value);
  21.             } else {
  22.                 update(v * 2 + 2, tm, tr, i, value);
  23.             }
  24.             t[v] = t[v * 2 + 1] + t[v * 2 + 2];
  25.         }
  26.     }
  27.    
  28.     T get(size_t v, size_t tl, size_t tr, size_t l,  size_t r) {
  29.         if (tl >= r || tr <= l) {
  30.             return ZeroValue_;
  31.         }
  32.         if (tl >= l && tr <= r) {
  33.             return t[v];
  34.         } else {
  35.             size_t tm = (tl + tr) / 2;
  36.             T answer = get(v * 2 + 1, tl, tm, l, r) + get(v * 2 + 2, tm, tr, l, r);
  37.             return answer;
  38.         }
  39.     }
  40.  
  41. private:
  42.     TVector<T> Tree_;  
  43.     size_t Size_;
  44.     T ZeroValue_;
  45. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement