树状数组——解决动态前缀和问题的数据结构

//树状数组下标必须从1开始 

#include<cstdio>
const int maxn = 1e+5;
int C[maxn],A[maxn];
int n; 
int lowbit(int x){
	return x&(-x);
} 

int query(int x){ //查询A[x]前面的和 
	int res=0;
	while(x){
		res += C[x];
		x -= lowbit(x);
	}
	return res;
}

void add(int x, int v){ //对A[x]加上v
	while(x <= n){
		C[x] += v;
		x += lowbit(x);  //以更新A[6]为例,实际是更新的C[6],C[8],C[16],C[32]等 
	} 
}
int main(){
	int tmp;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&tmp);
		add(i,tmp);
	}
	int num;  //查询该数的前缀和
	scanf("%d",&num);
	printf("%d\n",query(num));
	return 0;
}