求前缀和:(求数组1~k个元素的和)
注意:重要的查询关系 k&(-k)
#include<iostream>
using namespace std;
//由原数组维护一个对应的树状数组
void build(int a[],int c[],int N) //原数组为a,大小为N
{
for (int i = 0; i < N; i++)
{
int k = i+1; //让k从1开始
while (k <= N)
{
c[k] += a[i];
k += k&(-k);
}
}
}
//求区间和
int sum(int c[], int k) //区间[1~k],前k个数的和
{
int s = 0;
while (k > 0)
{
s += c[k];
k -= k&(-k);
}
return s;
}
int main(void