树状数组——解决动态前缀和问题的数据结构
//树状数组下标必须从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;
}