本题是一个简单的线段树 用数组模拟形成树状数组进行更改和查询
这倒题我使用了结构体 但是结构体的用处不大
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct sa{
int x,y,sum;}p[1000520];
int num;
void updat(int id,int l,int r,int mid,int a){
if(l==r){
p[mid].sum+=a;
p[mid].x=l;
p[mid].y=r;
return;
}
int i=(l+r)>>1;
if(id>i)updat(id,i+1,r,2*mid+1,a);//采用递归的方式进行更新
if(id<=i)updat(id,l,i,2*mid,a);
p[mid].sum=p[2*mid].sum+p[2*mid+1].sum;
p[mid].x=l;
p[mid].y=r;
}//创建和更新用同一个函数 因为意思都差不多
void su(int l,int r,int mid,int ll,int rr){
if(p[mid].x>=ll&&p[mid].y<=rr){
num+=p[mid].sum;
return;
}
else{
int i=(l+r)>>1;
if(ll<=i)
su(l,i,2*mid,ll,rr);
if(rr>i)
su(i+1,r,2*mid+1,ll,rr);
}
}//询问函数 询问和的值
int main()
{
int t,x1,x2;
scanf("%d",&t);
int k=1;
while(t--){
memset(p,0,sizeof(p));
int n;
int a;
scanf("%d",&n);
for(int i=1; i<=n; i++){
scanf("%d",&a);
updat(i,1,n,1,a);
}
printf("Case %d:\n",k++);
char str[50];
while(scanf("%s",str)!=EOF){
if(strcmp(str,"Query")==0){
scanf("%d%d",&x1,&x2);
num=0;
su(1,n,1,x1,x2);
printf("%d\n",num);
}
if(strcmp(str,"Add")==0){
scanf("%d%d",&x1,&x2);
updat(x1,1,n,1,x2);
}
if(strcmp(str,"Sub")==0)
{
scanf("%d%d",&x1,&x2);
updat(x1,1,n,1,x2*-1);
}
if(strcmp(str,"End")==0)break;
}
}
return 0;
}