Code:
//树状数组
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 50010;
int a[maxn]; //放元素的数组;
int bit[maxn]; //树状数组
int n;
int lowbit(int i) //求i这个数只有i的随后一位为1的数如:
//lowbit(8) = 8 8:1000 -> 1000
//lowbit(6) = 2 6:0110 -> 0010
//lowbit(4) = 4 4:0100 -> 0100
{
return i & (-i); //机器补码的特性,强大的二进制
}
void add(int i, int x) //元素a[i] 加上x
{
for(i; i <= n; i += lowbit(i))
bit[i] += x;
return ;
}
int sum(int i) //求a[1 ~ i]的和
{
int s = 0;
while(i > 0)
{
s += bit[i];
i -= lowbit(i);
}
return s;
}
int main()
{
int T;
scanf("%d", &T);
//getchar();
for(int kase = 1; kase <= T; kase++)
{
int N;
scanf("%d", &N);
n = N;
memset(a, 0, sizeof(a));
memset(bit, 0, sizeof(bit));
for(int i = 1; i <= N; i++)
{
int x;
//scanf("%d", &x);
scanf("%d", &a[i]);
add(i, a[i]);
}
//要注意更改元素的值的时候,不能只更改树状数组里面的值,数组里面的值也应该更改
//求(a ~ b )区间和的时候可以采用 sum(b) - sum(a-1)来求算
}
return 0;
}