#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <iostream>
#include <ctype.h>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#define left (now<<1)
#define right ((now<<1)+1)
#define mid ((l+r)>>1)
#define fst first
#define snd second
using namespace std;
typedef long long lint;
struct segmentTree{
int sum;
};
int t,n,a[50010];
char str[10];
segmentTree tree[2000010];
void buildTree(int now,int l,int r){ //建树
if(l == r){
tree[now].sum = a[l]; return;
}
buildTree(left,l,mid); buildTree(right,mid+1,r);
tree[now].sum = tree[left].sum + tree[right].sum;
return;
}
void updateTree(int now,int l,int r,int set,int setNum){ //更新树
if(l == r){
tree[now].sum += setNum;
return;
}
if(set <= mid){
updateTree(left,l,mid,set,setNum);
}else{
updateTree(right,mid+1,r,set,setNum);
}
tree[now].sum = tree[left].sum + tree[right].sum;
}
int getSum(int now,int l,int r,int ql,int qr){ //求和
if(ql == l && qr == r){
return tree[now].sum;
}
int re = 0;
if(ql <= mid){
re += getSum(left,l,mid,ql,min(qr,mid));
}
if(qr > mid){
re += getSum(right,mid+1,r,max(ql,mid+1),qr);
}
return re;
}
int main(){
scanf("%d",&t);
int ca = 0;
while(t--){
++ca;
memset(a,0,sizeof(a));
scanf("%d",&n);
for(int i = 1; i <= n; ++i){
scanf("%d",&a[i]);
}
scanf("%s",str);
buildTree(1,1,n);
printf("Case %d:n",ca);
while(str[0] != 'E'){
if(str[0] == 'A'){
int u,v;
scanf("%d%d",&u,&v);
updateTree(1,1,n,u,v);
}else if(str[0] == 'S'){
int u,v;
scanf("%d%d",&u,&v);
updateTree(1,1,n,u,-v);
}else if(str[0] == 'Q'){
int u,v;
scanf("%d%d",&u,&v);
int ans = getSum(1,1,n,u,v);
printf("%dn",ans);
}
scanf("%s",str);
}
}
}
区间求和
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <iostream>
#include <ctype.h>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#define left (now<<1)
#define right ((now<<1)+1)
#define mid ((l+r)>>1)
#define fst first
#define snd second
using namespace std;
typedef long long lint;
struct segmentTree{
int sum;
};
int t,n,a[50010];
char str[10];
segmentTree tree[2000010];
void buildTree(int now,int l,int r){ //建树
if(l == r){
tree[now].sum = a[l]; return;
}
buildTree(left,l,mid); buildTree(right,mid+1,r);
tree[now].sum = tree[left].sum + tree[right].sum;
return;
}
void updateTree(int now,int l,int r,int set,int setNum){ //更新树
if(l == r){
tree[now].sum += setNum;
return;
}
if(set <= mid){
updateTree(left,l,mid,set,setNum);
}else{
updateTree(right,mid+1,r,set,setNum);
}
tree[now].sum = tree[left].sum + tree[right].sum;
}
int getSum(int now,int l,int r,int ql,int qr){ //求和
if(ql == l && qr == r){
return tree[now].sum;
}
int re = 0;
if(ql <= mid){
re += getSum(left,l,mid,ql,min(qr,mid));
}
if(qr > mid){
re += getSum(right,mid+1,r,max(ql,mid+1),qr);
}
return re;
}
int main(){
scanf("%d",&t);
int ca = 0;
while(t--){
++ca;
memset(a,0,sizeof(a));
scanf("%d",&n);
for(int i = 1; i <= n; ++i){
scanf("%d",&a[i]);
}
scanf("%s",str);
buildTree(1,1,n);
printf("Case %d:n",ca);
while(str[0] != 'E'){
if(str[0] == 'A'){
int u,v;
scanf("%d%d",&u,&v);
updateTree(1,1,n,u,v);
}else if(str[0] == 'S'){
int u,v;
scanf("%d%d",&u,&v);
updateTree(1,1,n,u,-v);
}else if(str[0] == 'Q'){
int u,v;
scanf("%d%d",&u,&v);
int ans = getSum(1,1,n,u,v);
printf("%dn",ans);
}
scanf("%s",str);
}
}
}
区间求和