// 树状数组结构:通过nlog2(n)的时
#include<stdio.h>
#include<string.h>
int a[10005];
int c[10005];
int n;
int lowbit(int x){
// 树状数组关系运算
return x&(-x);
}
int getSum(int x){
// 它可以用logn的复杂度遍历前x项,实现累加、累减、取最大值等操作,需要update函数配合,关键是c[i]代表的数据是什么
int ans = 0;
while(x > 0){
ans += c[x];
// 求前x个的前缀和,向前找
x -= lowbit(x);
}
return ans;
}
void update(int x, int value){
// 更新原数组某一项值和与其相关的树状数组值
a[x] += value;
while(x <= n){
c[x] += value;
// 在第x个后面的前缀和才会受到第x个的影响,向后更新
x += lowbit(x);
}
}
int main(){
while(scanf("%d", &n)!=EOF){
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
for(int i = 1; i <= n; i++){
int temp;
scanf("%d", &temp);
// 更新修改的那一部分值
update(i, temp-arr[i]);
}
int ans = getSum(n-1);
printf("%d\n", ans);
}
return 0;
}
间复杂度修改或更新前缀和