2
public int countRangeSum(int[] nums, int lower, int upper) {3
int n = nums.length, ans = 0;4
long[] pre = new long[n + 1];5
for (int i = 0; i < n; i++) {6
pre[i + 1] = nums[i] + pre[i];9
int[] bit = new int[pre.length + 2];11
for (int i = 0; i < n; i++) {12
update(bit, bs(sum, pre), 1);14
ans += sum(bit, bs(sum - lower, pre)) - sum(bit, bs(sum - upper - 1, pre));19
private int bs(long sum, long[] pre) { // return the index of first number bigger than sum20
int lo = 0, hi = pre.length;22
int mid = (lo + hi) >> 1;32
private void update(int[] bit, int idx, int inc) {33
for (++idx; idx < bit.length; idx += idx & -idx) {38
private int sum(int[] bit, int idx) {40
for (++idx; idx > 0; idx -= idx & -idx) {