树状数组
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);
}
}
}
}
浙公网安备 33010602011771号