今天学了自闭树,开始不知道哪错了,看了一边又一遍。。。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200000+10;
struct node{
int left,right;
int sum;
}tree[maxn*4];
int a[maxn];
void push_up(int id)
{
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
void build(int id,int l,int r)
{
tree[id].left=l,tree[id].right=r;
if(l==r){
tree[id].sum=a[r];
return ;
}
build(id*2,l,(l+r)/2);
build(id*2+1,(l+r)/2+1,r);
push_up(id);
}
void update(int id,int pos,int change)
{
if(pos==tree[id].right && pos==tree[id].left){//???
tree[id].sum+=change;
return;
}
int mid=(tree[id].left+tree[id].right)/2;
if(mid<pos) update(id*2+1,pos,change);
else update(id*2,pos,change);
push_up(id);
}
int query(int id,int l,int r)
{
// if(tree[id].left==tree[id].right)
// return tree[id].sum;
if(l==tree[id].left && r==tree[id].right)
return tree[id].sum;
int mid=(tree[id].left+tree[id].right)/2;
if(r<=mid) return query(id*2,l,r);
else if(mid<l) return query(id*2+1,l,r);
else return query(id*2,l,mid)+query(id*2+1,mid+1,r); //??
}
int main()
{
int T;
cin >> T;
int cnt=0;
while(T--)
{
int n,i,j,k,p1,p2;
cin >> n;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
printf("Case %d:\n",++cnt);
char temp[20];
while(scanf("%s",temp))
{
if('E'==temp[0]) break;
scanf("%d %d",&p1,&p2);
if('Q'==temp[0]) printf("%d\n",query(1,p1,p2));
else if('A'==temp[0]) update(1,p1,p2);
else if('S'==temp[0]) update(1,p1,-p2);
}
}
return 0;
}