A - Segment Tree, part 1 - Codeforces
起码会单点修改了。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int a[N];
ll d[N<<2];
void build(int l,int r,int p)
{
if(l==r){
d[p]=a[l];
return;
}
int m=l+((r-l)>>1);
build(l,m,p<<1),build(m+1,r,(p<<1)|1);
d[p]=d[p<<1]+d[(p<<1)|1];
}
void upd(int p,int l,int r,int i,int v)
{
if(l==r){
d[p]=v;
return;
}
int mid=l+((r-l)>>1);
if(i<=mid) upd(p<<1,l,mid,i,v);
else upd((p<<1)|1,mid+1,r,i,v);
d[p]=d[p<<1]+d[(p<<1)|1];
}
ll query(int p,int lx,int rx,int l,int r)
{
if(lx>r||rx<l) return 0;
if(lx>=l&&rx<=r)
return d[p];
int mid=lx+((rx-lx)>>1);
return query(p<<1,lx,mid,l,r)+query((p<<1)|1,mid+1,rx,l,r);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
while(q--){
int op;
cin>>op;
if(op==1){
int i,v;
cin>>i>>v;
i++;
upd(1,1,n,i,v);
}else{
int l,r;
cin>>l>>r;
l++;
cout<<query(1,1,n,l,r)<<'\n';
}
}
return 0;
}
单点修改得确定这个点在哪个范围里,然后递归。其实感觉还行。