树状数组是一个查询和修改复杂度都为log(n)的数据结构,主要用于数组的单点修改&&区间求和。
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6 + 7;
int a[N],tree[N];
int n;
int lowbit(int x) {
return x & -x;
}
void update(int x,int y) {
while(x <= n){
tree[x] += y;
x += lowbit(x);
}
}
int getsum(int i) {
int ans = 0;
while(i > 0) {
ans += tree[i];
i -= lowbit(i);
}
return ans;
}
int main( ) {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
update(i,a[i]);
}
int l,r;
cin >> l >> r;
cout << getsum(r) - getsum(l - 1); // 求[l,r]区间和
return 0;
}