单点修改 + 区间查询
struct BIT{
int len;
int e[N];
int lowbit(int x) {
return x & (-x);
}
// 单点修改
void add(int x, int v) {
while (x <= len) {
e[x] += v;
x += lowbit(x);
}
}
// 前缀和
int ask(int x) {
int ans = 0;
while (x) {
ans += e[x];
x -= lowbit(x);
}
return ans;
}
BIT(int n, int *a) {
len = n;
memset(e, 0, sizeof e); // **
rep(i, 1, n) {
cin >> a[i];
add(i, a[i]);
}
}
};
模板题 洛谷【模板】树状数组 1
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define rep(i,a,b) for(int i = a; i <= b; i ++)
#define lb(x) x&(-x)
const int N = 5e5 + 5;
int a[N];
struct BIT{
int len;
int e[N];
void add(int x, int v) {
while (x <= len) {
e[x] += v;
x += lb(x);
}
}
int ask(int x) {
int ans = 0;
while (x) {
ans += e[x];
x -= lb(x);
}
return ans;
}
BIT(int n, int *a) {
len = n;
memset(e, 0, sizeof e);
rep(i, 1, n) {
cin >> a[i];
add(i, a[i]);
}
}
};
int main() {
IOS;
int n, m; cin >> n >> m;
BIT tre(n, a);
while (m --) {
int op, x, y; cin >> op >> x >> y;
if (op == 1) tre.add(x, y);
else cout << tre.ask(y) - tre.ask(x - 1) << "\n";
}
return 0;
}
区间修改 + 单点查询
struct BIT{
int len;
int b[N];
int lb(x) {
return x & -x;
}
void add(int x, int v) {
while (x <= len) {
b[x] += v;
x += lb(x);
}
}
int que(int x) {
int ans = 0;
while (x) {
ans += b[x];
x -= lb(x);
}
return ans;
}
BIT(int n, int *a) {
len = n;
memset(b, 0, sizeof b);
rep(i, 1, n) {
cin >> a[i];
add(i, a[i] - a[i - 1]);
}
}
};
模板题 洛谷树状数组2
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define rep(i,a,b) for(int i = a; i <= b; i ++)
#define lb(x) x&(-x)
const int N = 5e5 + 10;
int a[N];
struct BIT{
int len;
int b[N];
void add(int x, int v) {
while (x <= len) {
b[x] += v;
x += lb(x);
}
}
int que(int x) {
int ans = 0;
while (x) {
ans += b[x];
x -= lb(x);
}
return ans;
}
BIT(int n, int *a) {
len = n;
memset(b, 0, sizeof b);
rep(i, 1, n) {
cin >> a[i];
add(i, a[i] - a[i - 1]);
}
}
};
int main() {
IOS;
int n, m; cin >> n >> m;
BIT tre(n, a);
while (m --) {
int op; cin >> op;
if (op == 1) {
int l, r, v; cin >> l >> r >> v;
tre.add(l, v), tre.add(r + 1, -v);
} else {
int x; cin >> x;
cout << tre.que(x) << "\n";
}
}
return 0;
}