题目链接:https://www.luogu.org/problemnew/show/P3374
留个坑,以后补上BIT的讲解,先留下板子复习用
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int n,m; 6 int tree[500070],a[500070]; 7 int lowbit(int x) 8 { 9 return x&-x; 10 } 11 void add(int k,int num)//给k位置的数值加num 12 { 13 while(k<=n) 14 { 15 tree[k]+=num; 16 k+=lowbit(k); 17 } 18 } 19 int sum(int k)//前缀和 20 { 21 int s=0; 22 while(k) 23 { 24 s+=tree[k]; 25 k-=lowbit(k); 26 } 27 return s; 28 } 29 int main() 30 { 31 scanf("%d%d",&n,&m); 32 for(int i=1;i<=n;i++) 33 { 34 scanf("%d",&a[i]); 35 add(i,a[i]); 36 } 37 for(int i=1;i<=m;i++) 38 { 39 int c;scanf("%d",&c); 40 if(c == 1) 41 { 42 int x,k; 43 scanf("%d%d",&x,&k); 44 add(x,k); 45 } 46 else 47 { 48 int x,y;scanf("%d%d",&x,&y); 49 printf("%d ",sum(y)-sum(x-1)); 50 } 51 } 52 return 0; 53 }