树状数组[BIT]
1 #include <iostream> 2 using namespace std; 3 const int maxn=10000; 4 int a[maxn]; 5 int c[maxn]; 6 7 void make_c(int i){ 8 int x=i&(-i); //2^xi=i&(-i);求区间范围大小,x=2^xi 9 for(int left=i-x+1;left<=i;left++) //区间范围[i-2^x+1,i] 10 { 11 c[i]=c[i]+a[left]; //c[i]表示该区间范围内的元素之和 12 } 13 } 14 15 void updata(int i,int num,int n){ //将a[i]更改为new,更新c[i]数组 16 while(i<=n) 17 { 18 c[i]=c[i]+num; 19 i=i-i&(-i); 20 } 21 } 22 23 int sum(int i){ //前i个元素求和 24 int s=0; 25 while(i>0) 26 { 27 s+=c[i]; 28 i-=i&(-i); 29 } 30 return s; 31 } 32 33 int main(){ 34 int n; 35 cin>>n; 36 for(int i=1;i<=n;i++) 37 { 38 cin>>a[i];