树状数组真是一个神奇的东西,感觉和写线段树感觉有点像诶。
先来一个查询区间和的吧。
1 #define maxn 50005 2 int c[maxn], a[maxn]; 3 int n,t; 4 int Lowbit(int x) // 2^k 5 { 6 return x&(-x); 7 } 8 void update(int i, int x)//i点增量为x 9 { 10 while(i <= n) 11 { 12 c[i] += x; 13 i += Lowbit(i); 14 } 15 } 16 int sum(int x)//区间求和 [1,x] 17 { 18 int sum=0; 19 while(x>0) 20 { 21 sum+=c[x]; 22 x-=Lowbit(x); 23 } 24 return sum; 25 } 26 27 int Getsum(int x1,int x2) //求任意区间和 28 { 29 return sum(x2) - sum(x1-1); 30 }
仅供单点查询,留坑待补。