const int maxn=1000;
int a[maxn+5];
int sum[maxn*4];
void build(int cur,int l,int r){//O(n)
if(l==r){
sum[cur]=a[l];
return;
}
int m=(l+r)/2;
build(cur*2,l,m);
build(cur*2+1,m+1,r);
sum[cur]=sum[cur*2]+sum[cur+2+1];
}
int p,v;//令a[p]=v,O(logn)
void update(int cur,int l,int r){
if(l==r){
sum[cur]=v;
return;
}
int m=(l+r)/2;
if(p<=m)update(cur*2,l,m);
else update(cur*2+1,m+1,r);
sum[cur]=sum[cur*2]+sum[cur+2+1];
}
int ql,qr;//查询区间,O(logn)
int query(int cur,int l,int r){
if(ql<=l&&qr>=r)return sum[cur];//查询区间完全覆盖当前区间
int m=(l+r)/2;
int ans=0;
if(ql<=m)ans+=query(cur*2,l,m);//往左走
if(qr>m)ans+=query(cur*2+1,m+1,r);//往右走
return ans;
}
由于build函数会访问所有节点(O(n)),所以build函数以下写法也正确
int build(int cur,int l,int r){
if(l==r){
return sum[cur]=a[l];
}
int m=(l+r)/2;
return sum[cur]=build(cur*2,l,m)+build(cur*2+1,m+1,r);
}