Skip to Content
Team NoteAlgorithmMergeSortTree

MergeSortTree

template<class T> struct merge_sort { int size; vector<vector<T>> tree; merge_sort(int n) { size = 1 << int(ceil(log2(n)) + 1); tree.resize(size); } void add(int i, T v) { tree[i + size / 2].pb(v); } void build() { for (int i = size / 2 - 1; i >= 1; i--) { auto &c = tree[i], &l = tree[i * 2], &r = tree[i * 2 + 1]; c.resize(sz(l) + sz(r)); for (int p = 0, a = 0, b = 0; p < sz(c); p++) { if (b == sz(r) || (a < sz(l) && l[a] < r[b])) c[p] = l[a++]; else c[p] = r[b++]; } } } T query(int n, int nl, int nr, int l, int r, int k) { if (nl > r || nr < l) return 0; if (nl >= l && nr <= r) return ubi(tree[n], k); return query(n * 2, nl, (nl + nr) / 2, l, r, k) + query(n * 2 + 1, (nl + nr) / 2 + 1, nr, l, r, k); } T query(int l, int r, int k) { return query(1, 0, size / 2 - 1, l, r, k); } };
Last updated on