树状数组

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);
			}
		}
	}
} 

 

posted on 2023-04-05 23:15  towboat  阅读(24)  评论(0)    收藏  举报