最近被线段树缠辣,觉得道理很简答,但就是自己不会写。。好不容易按照模板写了一个,还RE。。到死啊。。。简直痛苦啊。呜呜呜呜。。。
原来就是一个小错误rt<<1+1 .....我等弱菜。。简直不能忍了。。
// .....re到爆了 因为 rt<<|1 与 rt<<+1 <<的优先级不同。。。。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
int sum[55555*4];
void BuildTree(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sum[rt]); //这种写法好轻盈啊觉得 省了不少空间
return ;
}
int mid=(l+r)>>1;
BuildTree(l,mid,rt<<1);
BuildTree(mid+1,r,rt<<1|1);
sum[rt]=sum[rt<<1]+sum[rt<<1|1]; //这里用数组代替了结构体 数组就是整棵树
}
int Query(int L,int R,int l,int r,int rt) //L,R 代表目标区间
{
if(L<=l && r<=R) //这里好神奇啊。。。换成等于就RE辣。。。
{
return sum[rt];
}
int m=(l+r)>>1;
int ret=0;
if(L<=m)ret+=Query(L,R,lson); //这里 和我最初想的不太一样,
if(R>m)ret+=Query(L,R,rson);
return ret;
}
void Update(int p,int add,int l,int r,int rt) //p代表操作的叶子节点
{ // rt 代表树的节点的下标
if(l==r)
{
sum[rt]+=add;
return ;
}
int mid=(l+r)>>1;
if(p<=mid)Update(p,add,l,mid,rt<<1);
else Update(p,add,mid+1,r,rt<<1|1);
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
int main()
{
// freopen("q.in","r",stdin);
int cas,k=1;
scanf("%d",&cas);
while(cas--)
{
cout<<"Case "<<k++<<":"<<endl;
char ch[20];
int a,b;
int n;
scanf("%d",&n);
// cout<<n<<endl;
BuildTree(1,n,1);
// build(1,n,1);
// cout<<"OK";
// for(int i=1;sum[i]!=0;i++)
// cout<<sum[i]<<" ";
while(scanf("%s",ch))
{
getchar();
if(ch[0]=='E') //新细节 挺好玩的
break;
scanf("%d%d",&a,&b);
if(ch[0]=='A')Update(a,b,1,n,1);
else if(ch[0]=='S')Update(a,-b,1,n,1);
else cout<<Query(a,b,1,n,1)<<endl;
}
}
}