区间查询&单点修改:
给定一个序列a,进行很多次操作:
访问a[l ~~ r]的区间和;
将a[i] 的值修改为 a[i] + 1;
求区间x ~~ y中的区间和:
#include <cstdio>
#include <algorithm>
#define MAXN 2222
int n, m;
int a[MAXN], s[MAXN];
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
s[i] = s[i - 1] + a[i]; //前缀和
}
for(int i = 1, x, y; i <= m; i++) {
//m次操作
scanf("%d%d", &x, &y);
printf("%d\n", s[y] - s[x - 1]);//s[y] - s[x - 1]即为x ~~ y的区间和
}
return 0;
}
/*
10 100
1 9 5 6 8 7 4 3 6 9
*/
树状数组:
/树状数组:动态维护前缀和/
#include<cstdio>
#define lowbit(x) (x & -x)
#define MAX 11111
int n,m;
int t[MAX],a[MAX];//t为树状数组
void add(int x, int k) {
//单点修改(向树上走)
for(int i = x; i <= n; i += lowbit(i)) {
t[i] += k;
}
}
int query(int x) {
//区间查询(在树下向前推进)//求的是前缀和
int sum = 0;
for(int i = x; i; i -= lowbit(i)) {
sum += t[i];
<