樹狀數組裸題
動態更新區間內的點,動態查詢區間和
敵兵佈陣
ac代碼
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
const int maxn=5e4+10;
int T,n,a[maxn];
//樹狀數組前驅和後繼
int lowbit(int x){
return x&-x;
}
//樹狀數組更新
void add(int i,int k){
while(i<=n){
a[i]+=k;
i+=lowbit(i);
}
}
//樹狀數組前綴和
int sum(int i){
int ans=0;
while(i>0){
ans+=a[i];
i-=lowbit(i);
}
return ans;
}
int main(){
int cnt=1;
string s;//輸入第一位
int l,r,result;
cin>>T;
while(T--){
memset(a,0,sizeof(a));//記得清零
cin>>n;
int tmp;
for(int i=1;i<=n;i++){
cin>>tmp;
add(i,tmp);//加入樹狀數組
}
printf("Case %d:\n",cnt++);//cnt++先用後++
while(cin>>s&&s!="End"){//輸入東西,東西不等於end
cin>>l>>r;
if(s=="Add"){
add(l,r);
}
else if(s=="Sub")
add(l,-r);//負的add
else if(s=="Query"){
result=sum(r)-sum(l-1);
cout<<result<<endl;
}
}
}
return 0;
}