树状数组
1. 求区间和
2. 单点赋值
还是单点改,通过维护一个a[ i ],来求改变值
#include <iostream> #include <cstring> #include <sstream> using namespace std; const int N=2e5+4; int n,a[N],c[N]; int lowbit(int x){ return x&-x; } void set(int x,int v){ int d=v-a[x]; a[x]+=d; for(;x<=n;x+=lowbit(x)) c[x]+=d; } int qq(int x){ int r=0; for(;x;x-=lowbit(x)) r+=c[x]; return r; } int main(){ int j=0; bool k=0; while(cin>>n){ j++; memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); if(n==0)return 0; if(k)cout<<'\n'; k=1; cout<<"Case "<<j<<':'<<'\n'; for(int i=1;i<=n;i++){ int x; cin>>x; set(i,x); } string s; getline(cin,s); while(getline(cin,s)){ stringstream ss(s); char str; int x,y; if(s=="END")break; else if(s[0]=='M'){ ss>>str>>x>>y; cout<<qq(y)-qq(x-1)<<'\n'; }else if(s[0]=='S'){ ss>>str>>x>>y; set(x,y); } } } }