标签:
分析:单点更新,区间求和
1 #include"cstdio" 2 using namespace std; 3 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 #define root 1,N,1 7 const int maxn=50000+5; 8 int sum[maxn<<2]; 9 int T,N,cas=0; 10 11 void pushup(int rt) 12 { 13 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 14 } 15 16 void build(int l,int r,int rt) 17 { 18 if(l==r) {scanf("%d",&sum[rt]);return;} 19 int m=(l+r)>>1; 20 build(lson); 21 build(rson); 22 pushup(rt); 23 } 24 25 void updata(int p,int add,int l,int r,int rt) 26 { 27 if(l==r) {sum[rt]+=add;return;} 28 int m=(l+r)>>1; 29 if(p<=m) updata(p,add,lson); 30 else updata(p,add,rson); 31 pushup(rt); 32 33 } 34 35 int query(int L,int R,int l,int r,int rt) 36 { 37 if(L<=l&&r<=R) return sum[rt]; 38 int m=(l+r)>>1; 39 int ret=0; 40 if(L<=m) ret+=query(L,R,lson); 41 if(m<R) ret+=query(L,R,rson); 42 return ret; 43 } 44 45 int main() 46 { 47 scanf("%d",&T); 48 while(T--) 49 { 50 scanf("%d",&N); 51 build(root); 52 int a,b; 53 char s[10]; 54 printf("Case %d:\n",++cas); 55 while(scanf("%s",s)&&s[0]!=‘E‘) 56 { 57 scanf("%d%d",&a,&b); 58 if(s[0]==‘A‘) updata(a,b,root); 59 if(s[0]==‘S‘) updata(a,-b,root); 60 if(s[0]==‘Q‘) printf("%d\n",query(a,b,root)); 61 } 62 } 63 return 0; 64 }
标签:
原文地址:http://www.cnblogs.com/nuc-gxg/p/5427499.html