树状数组
template <typename T>struct Fenwick { int n; vector<T> a;
Fenwick(int n_ = 0) { init(n_); }
void init(int n_) { n = n_; a.assign(n, T{}); }
void add(int x, const T &v) { for (int i = x + 1; i <= n; i += i & -i) { a[i - 1] = a[i - 1] + v; } }
void modify(int x) { add(x, -query(x, x)); }
T sum(int x) { T ans{}; for (int i = x; i > 0; i -= i & -i) { ans = ans + a[i - 1]; } return ans; }
T query(int l, int r) { if (l > r) return {}; return sum(r + 1) - sum(l); }
int select(const T &k) { int x = 0; T cur{}; for (int i = 1 << __lg(n); i; i /= 2) { if (x + i <= n && cur + a[x + i - 1] <= k) { x += i; cur = cur + a[x - 1]; } } return x - 1; } // 找到满足 sum(0, i) <= k 的最大 i,如果根本就没有会返回最小下标 -1};// +-1 是为了防止 0 出现死循环