首页 > 代码库 > 树状数组单点更新和区间查询
树状数组单点更新和区间查询
这里是最基本的操作。
单操作时间复杂度O(logN),空间复杂度O(N).
1 #include <fstream> 2 #include <iostream> 3 #include <cstdio> 4 5 using namespace std; 6 7 int n,m; 8 int a[100002],tree[100002]; 9 10 void build();//建树状数组11 int read(int pos);//求 sum[1,pos]的答案12 void update(int pos,int val);//把a[pos]加上v13 14 int main()15 {16 //freopen("D:\\input.in","r",stdin);17 //freopen("D:\\output.out","w",stdout);18 int bo,t1,t2;19 scanf("%d %d",&n,&m);20 for(int i=1;i<=n;i++)21 scanf("%d",&a[i]);22 build();23 for(int i=1;i<=m;i++)24 {25 scanf("%d%d%d",&bo,&t1,&t2);26 if(bo)27 update(t1,t2);28 else29 printf("%d\n",read(t2)-read(t1-1));30 }31 return 0;32 }33 void build()34 {35 tree[0]=0;36 for(int i=1;i<=n;i++)37 {38 tree[i]=a[i];39 for(int j=i-1;j>i-(i&(-i));j=j-(j&(-j)))40 {41 tree[i]+=tree[j];42 }43 }44 }45 int read(int pos)46 {47 int ans=0;48 while(pos>0)49 {50 ans+=tree[pos];51 pos-=pos&(-pos);52 }53 return ans;54 }55 void update(int pos,int val)56 {57 while(pos<=n)58 {59 tree[pos]+=val;60 pos+=pos&(-pos);61 }62 }
树状数组单点更新和区间查询
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。