解法一:树状数组
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&-(x))
const int N=5e4+10;
int sum[N];
int n;
void update(int x,int v){
while(x<=n){
sum[x]+=v;
x+=lowbit(x);
}
}
int query(int x){
int res=0;
while(x){
res+=sum[x];
x-=lowbit(x);
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
int k=1;
while(T--){
memset(sum,0,sizeof(sum));
cin>>n;
int x;
for(int i=1;i<=n;i++){
cin>>x;
update(i,x);
}
//for(int i=1;i<=n;i++)
// cout<<sum[i]<<' ';
cout<<"Case "<<k++<<':'<<endl;
char s[10];
int l,r;
while(1){
cin>>s;
if(s[0]=='E')
break;
else if(s[0]=='Q'){
cin>>l>>r;
cout<<query(r)-query(l-1)<<endl;
}
else if(s[0]=='A'){
cin>>l>>r;
update(l,r);
}
else{
cin>>l>>r;
update(l,-r);
}
}
}
return 0;
}
解法二:线段树
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int a[N];
struct Tree{
int l,r,sum;
}tree[N*4];
void BuildTree(int l,int r,int u){
tree[u].l=l;
tree[u].r=r;
if(l==r){
tree[u].sum=a[l];
return ;
}
int mid=(l+r)>>1;
BuildTree(l,mid,u<<1);
BuildTree(mid+1,r,(u<<1)+1);
tree[u].sum=tree[u<<1].sum+tree[(u<<1)+1].sum;
}
int query(int l,int r,int u){
if(tree[u].l==l&&tree[u].r==r)
return tree[u].sum;
int mid=(tree[u].l+tree[u].r)>>1;
if(r<=mid) return query(l,r,u<<1);
else if(l>mid) return query(l,r,(u<<1)+1);
else return query(l,mid,u<<1)+query(mid+1,r,(u<<1)+1);
}
void add(int j,int num,int u){
if(tree[u].l==tree[u].r){
tree[u].sum+=num;
return ;
}
else{
tree[u].sum+=num;
if(j<=tree[u<<1].r) add(j,num,u<<1);
else add(j,num,(u<<1)+1);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
int k=1;
while(T--){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
BuildTree(1,n,1);
char s[10];
int l,r;
cout<<"Case "<<k++<<':'<<endl;
while(1){
cin>>s;
if(s[0]=='E')
break;
else if(s[0]=='Q'){
cin>>l>>r;
cout<<query(l,r,1)<<endl;
}
else if(s[0]=='A'){
cin>>l>>r;
add(l,r,1);
}
else{
cin>>l>>r;
add(l,-r,1);
}
}
}
return 0;
}