#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+5;
int f[3*N],a[N];
void build(int root,int left,int right){
if(left==right){
f[root]=a[left];
return;
}
int mid,rt;
rt=root<<1;
mid=(left+right)>>1;//把这几行当成最后要执行的
build(rt,left,mid);//最后一个左边递归包含的两个展开的,满足条件的,能完整运行完递归的内容。
build(rt+1,mid+1,right);//递归到最深层一定是左子叶是left=right=1,右子叶是left=right=2;
f[root]=f[rt]+f[rt+1];
}
void update(int root,int left,int right,int pos,int val){
if(left==right){
f[root]+=val;
return;
}
int mid,rt;
rt=root<<1;//root相当于一个节点,rt相当于节点延伸出去的两个子节点。
mid=(left+right)>>1;
if(pos<=mid){
update(rt,left,mid,pos,val);//这里也有相互包含关系。
}else{
update(rt+1,mid+1,right,pos,val);//和build一样只不过是父节点只包含了一个儿子。
}
f[root]=f[rt]+f[rt+1];
}
int query(int root,int left,int right,int qleft,int qright){
if(qleft<=left&&right<=qright){
return f[root];
}
int mid,rt;
rt=root<<1;
mid=(left+right)>>1;
int ans=0;
if(qleft<=mid){
ans+=query(rt,left,mid,qleft,qright);//第一步确定左边或者右边的方向大方向祖先的俩儿子,有则选之。
}
if(mid<qright){
ans+=query(rt+1,mid+1,right,qleft,qright);
}
return ans;
}
int main(){
int T,n;
char s[5];
scanf("%d",&T);
for(int t=1;t<=T;t++){
printf("Case %d:\n",t);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
while(cin>>s){
int i,j;
if(s[0]=='E'){
break;
}
scanf("%d%d",&i,&j);
if(s[0]=='A'){
update(1,1,n,i,j);
}else if(s[0]=='S'){
update(1,1,n,i,-j);
}else {
printf("%d\n",query(1,1,n,i,j));
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理