您的位置:首页 > 其它

树状数组单点更新和区间查询

2014-12-04 23:36 423 查看
这里是最基本的操作。

单操作时间复杂度O(logN),空间复杂度O(N).

#include <fstream>
#include <iostream>
#include <cstdio>

using namespace std;

int n,m;
int a[100002],tree[100002];

void build();//建树状数组
int read(int pos);//求 sum[1,pos]的答案
void update(int pos,int val);//把a[pos]加上v

int main(){
//freopen("D:\\input.in","r",stdin);
//freopen("D:\\output.out","w",stdout);
int bo,t1,t2;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build();
for(int i=1;i<=m;i++){
scanf("%d%d%d",&bo,&t1,&t2);
if(bo)
update(t1,t2);
else
printf("%d\n",read(t2)-read(t1-1));
}
return 0;
}
void build(){
tree[0]=0;
for(int i=1;i<=n;i++){
tree[i]=a[i];
for(int j=i-1;j>i-(i&(-i));j=j-(j&(-j)))
tree[i]+=tree[j];
}
}
int read(int pos){
int ans=0;
while(pos>0){
ans+=tree[pos];
pos-=pos&(-pos);
}
return ans;
}
void update(int pos,int val){
while(pos<=n){
tree[pos]+=val;
pos+=pos&(-pos);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: