线段树方法
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <list>
#define INF 0x3f3f3f
#define maxn 50000 + 50
#define juzheng 300
#define ll long long
using namespace std;
struct xx{
int left;
int right;
int val;
}tree[140000];
int arr[maxn],n,sum;
void bulid_tree(int node,int left,int right){
tree[node].left = left;
tree[node].right = right;
if(left == right)
tree[node].val = arr[left];
else{
int mid = (left + right) / 2;
bulid_tree(node * 2,left,mid);
bulid_tree(node * 2 + 1,mid + 1,right);
tree[node].val = tree[node * 2].val + tree[node * 2 + 1].val;
}
}
void add(int node,int index,int val){
tree[node].val += val;
if(tree[node].right == tree[node].left)
return;
int mid = (tree[node].left + tree[node].right) / 2;
if(index > mid)
add(node * 2 + 1,index,val);
else
add(node * 2,index,val);
}
void get_sum(int node,int left,int right){
if(tree[node].left >= left && tree[node].right <= right)
sum += tree[node].val;
else{
int mid = (tree[node].left + tree[node].right) / 2;
if(left > mid)
get_sum(node * 2 + 1,left,right);
else if(right <= mid)
get_sum(node * 2,left,right);
else{
get_sum(node * 2,left,right);
get_sum(node * 2 + 1,left,right);
}
}
}
int main(){
int t,s,e,index,val;
string str;
while(~scanf("%d",&t)){
for(int p = 1;p <= t;p++){
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%d",&arr[i]);
bulid_tree(1,1,n);
printf("Case %d:\n",p);
while(cin >> str){
if(str[0] == 'Q'){
scanf("%d %d",&s,&e);
sum = 0;
get_sum(1,s,e);
printf("%d\n",sum);
}
else if(str[0] == 'A'){
scanf("%d %d",&index,&val);
add(1,index,val);
}
else if(str[0] == 'S'){
scanf("%d %d",&index,&val);
add(1,index,-val);
}
else
break;
}
}
}
return 0;
}
树状数组方法
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <list>
#define INF 0x3f3f3f
#define maxn 50000 + 50
#define juzheng 300
#define ll long long
using namespace std;
int n,tree[maxn];
int lowbit(int x) {
return x & (-x);
}
void add(int index,int val) {
for(int i = index; i <= n; i += lowbit(i))
tree[i] += val;
}
int get_sum(int index) {
if(index == 0)
return 0;
int ans = 0;
for(int i = index; i > 0; i -= lowbit(i))
ans += tree[i];
return ans;
}
void init() {
memset(tree,0,sizeof(tree));
}
int main() {
int t,index,val,s,e;
string str;
while(~scanf("%d",&t)) {
for(int p = 1; p <= t; p++) {
scanf("%d",&n);
init();
for(int i = 1; i <= n; i++) {
scanf("%d",&val);
add(i,val);
}
printf("Case %d:\n",p);
while(cin >> str) {
if(str[0] == 'A') {
scanf("%d %d",&index,&val);
add(index,val);
}
else if(str[0] == 'S') {
scanf("%d %d",&index,&val);
add(index,-val);
}
else if(str[0] == 'Q') {
scanf("%d %d",&s,&e);
cout << get_sum(e) - get_sum(s - 1) << endl;
}
else
break;
}
}
}
return 0;
}