#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<string>
#include<map>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int Max_n=50005;
const int Max_char=10;
int a[Max_n],f[Max_n*4];
char b[Max_char];
void creat(int id,int L,int R){
if(L==R)
f[id]=a[L];
else{
int mid=L+(R-L)/2;
creat(2*id,L,mid);
creat(2*id+1,mid+1,R);
f[id]=f[2*id]+f[2*id+1];
}
}
void add(int id,int L,int R,int index,int key){
if(L==R)
f[id]+=key;
else{
int mid=L+(R-L)/2;
if(index<=mid)
add(2*id,L,mid,index,key);
else
add(2*id+1,mid+1,R,index,key);
f[id]=f[2*id]+f[2*id+1];
}
}
int quary(int id,int L,int R,int l,int r){
if(L>=l&&R<=r)
return f[id];
int mid=L+(R-L)/2;
if(r<=mid)
return quary(2*id,L,mid,l,r);
else if(mid<l)
return quary(2*id+1,mid+1,R,l,r);
else
return quary(2*id,L,mid,l,r)+quary(2*id+1,mid+1,R,l,r);
}
int main(){
int t,count=0;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
creat(1,1,n);
printf("Case %d:\n",++count);
while(~scanf("%s",b)){
if(strcmp(b,"End")==0)
break;
int index,key;
scanf("%d%d",&index,&key);
if(strcmp(b,"Add")==0)
add(1,1,n,index,key);
else if(strcmp(b,"Sub")==0)
add(1,1,n,index,-key);
else
printf("%d\n",quary(1,1,n,index,key));
}
}
return 0;
}
敌兵布阵(线段树模板-单点修改和查询)
最新推荐文章于 2022-09-22 00:05:40 发布