Skip to Content
Team NoteAlgorithmSegmentTreeGold

SegmentTreeGold

template<class T> struct seg_tree_merge { int N; struct node { T all, ml, mr, mx; }; const T INF = numeric_limits<T>::max() >> 1; vector<node> tree; seg_tree_merge(int N) : N(N) { int tree_size = 1 << ((int) ceil(log2(N)) + 1); tree.resize(tree_size); } node merge(node l, node r) { node ret; ret.all = l.all + r.all; ret.ml = max(l.ml, l.all + r.ml); ret.mr = max(r.mr, r.all + l.mr); ret.mx = max({l.mx, r.mx, l.mr + r.ml}); return ret; } void update(int n, int nl, int nr, int i, T v) { if (nl > i || nr < i) return; if (nl == nr) { tree[n] = {v, v, v, v}; return; } int m = (nl + nr) >> 1; update(n * 2, nl, m, i, v); update(n * 2 + 1, m + 1, nr, i, v); tree[n] = merge(tree[n * 2], tree[n * 2 + 1]); } void update(int i, T v) { update(1, 0, N - 1, i, v); }; node query(int n, int nl, int nr, int l, int r) { if (nl > r || nr < l) return {0, -INF, -INF, -INF}; if (nl >= l && nr <= r) return tree[n]; int m = (nl + nr) >> 1; return merge(query(n * 2, nl, m, l, r), query(n * 2 + 1, m + 1, nr, l, r)); } node query(int l, int r) { return query(1, 0, N - 1, l, r); }; };
Last updated on