更新每个节点,查找区间值
#include <iostream>
#include <stdio.h>#define lson i<<1,left,mid
#define rson i<<1|1,mid+1,right
using namespace std;
struct TreeNode
{
int left;
int right;
int num;
}Tree[50010*4];
int a[50010];
int ans;
void Build(int i, int left ,int right)
{
Tree[i].left=left;
Tree[i].right=right;
if(left==right)
{
scanf("%d",&Tree[i].num);
return ;
}
int mid=(left+right)>>1;
Build(lson);
Build(rson);
Tree[i].num=Tree[i<<1].num+Tree[i<<1|1].num;
}
void add(int i,int aim,int number)
{
if(Tree[i].left==aim&&Tree[i].left==Tree[i].right)
{
Tree[i].num+=number;
return ;
}
int mid=(Tree[i].left+Tree[i].right)>>1;
if(aim<=mid)
{
add(i<<1,aim,number);
}
else
{
add(i<<1|1,aim,number);
}
Tree[i].num=Tree[i<<1].num+Tree[i<<1|1].num;
}void sub(int i,int aim,int number)
{
if(Tree[i].left==aim&&Tree[i].left==Tree[i].right)
{
Tree[i].num-=number;
return ;
}
int mid=(Tree[i].left+Tree[i].right)>>1;
if(aim<=mid)
{
sub(i<<1,aim,number);
}
else
{
sub(i<<1|1,aim,number);
}
Tree[i].num=Tree[i<<1].num+Tree[i<<1|1].num;
}
void q (int i,int left,int right)
{
if(left==Tree[i].left&&Tree[i].right==right)
{
ans+=Tree[i].num;
return ;
}
int mid=(Tree[i].left+Tree[i].right)>>1;
if(left>mid)
{
q(i<<1|1,left,right);
}
else if(right<=mid)
{
q(i<<1,left,right);
}
else
{
q(lson);
q(rson);
}
}
int main()
{
int T;
int n,i,j;
cin>>T;
char s[10];
for(i=1;i<=T;i++)
{
printf("Case %d:\n",i);
cin>>n;
Build(1,1,n);
int x,y;
while(1)
{
scanf("%s",s);
if(s[0]=='A')
{ scanf("%d%d",&x,&y);
add(1,x,y);
}
else if(s[0]=='Q')
{
ans=0;
scanf("%d%d",&x,&y);
q(1,x,y);
printf("%d\n",ans);
}
else if(s[0]=='S')
{scanf("%d%d",&x,&y);
sub(1,x,y);
}
else
break;
}
}
return 0;
}