Skip to content

Instantly share code, notes, and snippets.

@izanbf1803
Last active January 15, 2019 15:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save izanbf1803/4591c4b274a75e1f8372b71a1d424e57 to your computer and use it in GitHub Desktop.
Save izanbf1803/4591c4b274a75e1f8372b71a1d424e57 to your computer and use it in GitHub Desktop.
Compact recursive implementation of basic Segment Tree.
template <typename T>
struct SegmentTree {
int n;
T* t;
T zero_val;
inline T merge(T a, T b)
{
return a + b; // MODIFY FOR EACH PROBLEM
}
void update(int node, int l, int r, int i, T v)
{
if (l > i or r < i) return; // Interval outside query
if (l == r) { // leaf node
t[node] = v; // MODIFY FOR EACH PROBLEM
return;
}
int m = (l+r)/2;
update(2*node, l, m, i, v);
update(2*node+1, m+1, r, i, v);
t[node] = merge(t[2*node], t[2*node+1]);
}
T query(int node, int l, int r, int i, int j)
{
if (l > j or r < i) return 0; // Interval outside query. MODIFY FOR EACH PROBLEM
if (l >= i and r <= j) return t[node]; // Interval completely inside query
int m = (l+r)/2;
return merge(query(2*node, l, m, i, j), query(2*node+1, m+1, r, i, j));
}
void build(T node, int l, int r, int arr[])
{
if (l == r) { // leaf node
t[node] = arr[l];
return;
}
int m = (l+r)/2;
build(2*node, l, m, arr);
build(2*node+1, m+1, r, arr);
t[node] = merge(t[2*node], t[2*node+1]);
}
void setup(int n_, T zero_val_)
{
n = n_;
zero_val = zero_val_;
t = new T[4*n];
memset(t, 0, 4*n*sizeof(T));
}
inline void build(T arr[]) { build(1, 0, n-1, arr); }
inline void update(int i, T v) { update(1, 0, n-1, i, v); }
inline T query(int i, int j) { return query(1, 0, n-1, i, j); }
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment