【洛谷 p3374】模板-树状数组 1(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x;2.求出某区间每一个数的和。
解法:树状数组求前缀和。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 const int N=500010; 8 int n; 9 int c[N]; 10 11 int lowbit(int x) {return x&-x;} 12 void ins(int x,int d) 13 { 14 for (int i=x;i<=n;i+=lowbit(i)) 15 c[i]+=d; 16 } 17 int query(int x) 18 { 19 int h=0; 20 for (int i=x;i>=1;i-=lowbit(i)) 21 h+=c[i]; 22 return h; 23 } 24 int main() 25 { 26 int m,x,y,k; 27 scanf("%d%d",&n,&m); 28 for (int i=1;i<=n;i++) 29 { 30 scanf("%d",&x); 31 ins(i,x); 32 } 33 while (m--) 34 { 35 scanf("%d%d%d",&k,&x,&y); 36 if (k==1) ins(x,y); 37 else 38 { 39 if (x>y) {int t;t=x,x=y,y=t;} 40 printf("%d\n",query(y)-query(x-1)); 41 } 42 } 43 return 0; 44 }