const int maxn = 1e5 + 7;
struct BIT {
int C[maxn];
int n;
void init(int n) {
this->n = n;
memset(C, 0, sizeof(maxn));
}
int lowbit(int x) { return x & -x; }
int sum(int x) {
int ret = 0;
while (x > 0) {
ret += C[x];
x -= lowbit(x);
}
return ret;
}
void add(int x, int d) {
while (x <= n) {
C[x] += d;
x += lowbit(x);
}
}
} bit;
可以改成区间增加,单点查询:
区间加d:
void update(int L,int R,int d){
add(L,d);add(R+1,-d);
}
单点查询:
sum(x) //原来的区间查询就变成了单点查询
区间增减,区间查询:
const int maxn = 5e5 + 7;
struct BIT {
int C[maxn];
int n;
void init(int n) {
this->n = n;
memset(C, 0, sizeof(maxn));
}
int lowbit(int x) { return x & -x; }
int sum(int x) {
int ret = 0;
while (x > 0) {
ret += C[x];
x -= lowbit(x);
}
return ret;
}
void add(int x, int d) {
while (x <= n) {
C[x] += d;
x += lowbit(x);
}
}
} bit;
struct BIT_array {
BIT T1, T2;
void init(int n) {
T1.init(n);
T2.init(n);
}
void add(int x, int d) {
T1.add(x, d);
T2.add(x, x * d);
}
void update(int L, int R, int d) {
add(L, d);
add(R + 1, -d);
}
int sum(int x) { return (x + 1) * T1.sum(x) - T2.sum(x); }
int query(int L, int R) { return sum(R) - sum(L - 1); }
} bit_array;