线段树(单点修改,区间查询)
vector<int> seg; // 线段树数组
void segUpdate(const int & k) {
seg[k] = seg[k << 1] + seg[k << 1 | 1];
}
void build(const int & k, const int & l, const int & r, vector<int> & nums) {
if (l == r) {
seg[k] = nums[l];
return;
}
int mid = (l + r) >> 1;
build(k << 1, l, mid, nums);
build(k << 1 | 1, mid + 1, r, nums);
segUpdate(k);
}
void change(const int & k, const int & l, const int & r, const int & x, const int & y) {
if (l == r) {
seg[k] = y;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) {
change(k << 1, l, mid, x, y);
}
else {
change(k << 1 | 1, mid + 1, r, x, y);
}
segUpdate(k);
}
int query(const int & k, const int & l, const int & r, const int & x, const int & y) {
if (x <= l && y >= r) {
return seg[k];
}
int mid = (l + r) >> 1;
int sum = 0;
if (x <= mid) {
sum += query(k << 1, l, mid, x, y);
}
if (y > mid) {
sum += query(k << 1 | 1, mid + 1, r, x, y);
}
return sum;
}
树状数组(单点修改区间查询)
int c[10000]; // 树状数组
void add(int i, const int & val) {
for (; i <= n; i += i & (-i)) {
c[i] += val;
}
}
int getsum(int i) {
int res = 0;
for (; i > 0; i -= i & (-i)) {
res += c[i];
}
return res;
}