树状数组详细讲解ppt,在这里
①单点修改,区间查询
题目描述
输入格式
输出格式
对于每个 2 l r 操作输出一行,每行有一个整数,表示所求的结果。
样例
样例输入
3 2
1 2 3
1 2 0
2 1 3
样例输出
6
算法分析
树状数组最重要的就是以下的三个函数,只要学会这三个函数,就做会这个题了。
/*lowbit(i)的意思是将 i 转化成二进制数之后,只保留最低位的1及
其后面的0,截断前面的内容,然后再转成十进制数,这个数也是树状数组
中i号位的子叶个数。
原数为i(十进制),先将原数转化成二进制之后,在
与原数相反数的二进制按位与,答案就是lowbit(i)的结果;*/
int lowbit(int i){
return i & -i;
}
/*这个函数的作用是用来更新原数组 a */
void update(int k,int x){
for(int i = k; i <= n; i += lowbit(i))
C[i] += x;
}
/*这个函数很简单,作用就是用来求前缀和*/
int Sum(int k){
for(int i = k; i > 0; i -= lowbit(i) )
B[k] += C[i];
return B[k];
}
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=1e8+5;
long long Bit[M];
int a[M];
int n,m;
long long lowbit(int x){
return x & (-x);
}
void update(int x,int y){
for(int i=x;i<=n;i+=lowbit(i)){
Bit[i]+=y;
}
}
long long Sum(int x)