Untitled
unknown
plain_text
10 months ago
2.0 kB
6
Indexable
class UserSolution { private final static int N = 200000; private final static int SUM = 0; private final static int MAX = 1; private final static int MIN = 2; private static int g(int a, int b) { return a > b ? a : b; } private static int l(int a, int b) { return a < b ? a : b; } int[][] st = new int[3][4 * (N+1)]; int[] d = new int[N + 1]; int n; public void updateST(int id) { st[SUM][id] = st[SUM][2 * id] + st[SUM][2 * id + 1]; st[MAX][id] = g(st[MAX][2 * id], st[MAX][2 * id + 1]); st[MIN][id] = l(st[MIN][2 * id], st[MIN][2 * id + 1]); } public void build(int id, int l, int r) { if (l == r) { st[SUM][id] = st[MAX][id] = st[MIN][id] = d[l]; } else { int mid = (l + r) / 2; build(2 * id, l, mid); build(2 * id + 1, mid + 1, r); updateST(id); } } public void update(int id, int l, int r, int i) { if (l == r) { st[SUM][id] = st[MAX][id] = st[MIN][id] = d[l]; } else { int mid = (l + r) / 2; if (l <= i && i <= mid) { update(2 * id, l, mid, i); } else update(2 * id + 1, mid + 1, r, i); updateST(id); } } public int get(int m, int id, int l, int r, int u, int v) { if (u > r || v < l) return m == MIN ? N : 0; if (u <= l && v >= r) return st[m][id]; int mid = (l + r) / 2; int v1 = get(m, 2 * id, l, mid, u, v); int v2 = get(m, 2 * id + 1, mid + 1, r, u, v); return m == SUM ? v1 + v2 : m == MAX ? g(v1, v2) : l(v1, v2); } public void init(int N, int mSubscriber[]) { n = N; for (int i = 0; i < N; i++) { d[i + 1] = mSubscriber[i]; } build(1, 1, n); } public int subscribe(int mId, int mNum) { d[mId] += mNum; update(1, 1, n, mId); return d[mId]; } public int unsubscribe(int mId, int mNum) { return subscribe(mId, -mNum); } public int count(int sId, int eId) { return get(SUM, 1, 1, n, sId, eId); } public int calculate(int sId, int eId) { return get(MAX, 1, 1, n, sId, eId) - get(MIN, 1, 1, n, sId, eId); } }
Editor is loading...
Leave a Comment