1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
单点更新,成段查询。
#include<cstdio> #include<cstring> using namespace std; #define MAX 50005 int sum[MAX<<2]; void push_up(int idx) { sum[idx]=sum[idx<<1]+sum[idx<<1|1]; } void build(int l,int r,int idx) { if(l==r) { scanf("%d",&sum[idx]); return; } int mid=(l+r)>>1; build(l,mid,idx<<1); build(mid+1,r,idx<<1|1); push_up(idx); return; } void update(int p,int a,int l,int r,int idx) { if(l==r) { sum[idx]+=a; return; } int mid=(l+r)>>1; if(p<=mid) update(p,a,l,mid,idx<<1); else update(p,a,mid+1,r,idx<<1|1); push_up(idx); } int query(int a,int b,int l,int r,int idx) { if(a<=l&&r<=b) return sum[idx]; int mid=(l+r)>>1; int cnt=0; if(a<=mid) cnt+=query(a,b,l,mid,idx<<1); if(b>mid) cnt+=query(a,b,mid+1,r,idx<<1|1); return cnt; } int main() { int cas,n,a,b; char s[10]; scanf("%d",&cas); for(int ans=1;ans<=cas;++ans) { scanf("%d",&n); build(1,n,1); printf("Case %d:\n",ans); for(;scanf("%s",s)&&s[0]!='E';) { scanf("%d%d",&a,&b); if(s[0]=='Q') printf("%d\n",query(a,b,1,n,1)); else if(s[0]=='A') update(a,b,1,n,1); else if(s[0]=='S') update(a,-b,1,n,1); } } return 0; }