线段树。代码如下:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #define max 50002 5 6 using namespace std; 7 8 typedef struct 9 { 10 int l, r; 11 int val; 12 }node; 13 14 node w[4*max]; 15 16 void pushup(int rt) 17 { 18 w[rt].val=w[rt<<1].val+w[rt<<1|1].val; 19 } 20 21 void build(int l, int r, int rt) 22 { 23 w[rt].l=l; 24 w[rt].r=r; 25 if (l == r) 26 { 27 scanf("%d", &w[rt].val); 28 return ; 29 } 30 int m=(l+r)>>1; 31 build(l, m, rt<<1); 32 build(m+1, r, rt<<1|1); 33 pushup(rt); 34 } 35 36 void update(int p, int v, int rt) 37 { 38 if (w[rt].l == w[rt].r) 39 { 40 w[rt].val+=v; 41 return ; 42 } 43 int m=(w[rt].l+w[rt].r)>>1; 44 if (p <= m) update(p, v, rt<<1); 45 else update(p, v, rt<<1|1); 46 pushup(rt); 47 } 48 49 int query(int L, int R, int rt) 50 { 51 if (w[rt].l == L && w[rt].r == R) 52 return w[rt].val; 53 int m=(w[rt].l+w[rt].r)>>1; 54 if (L > m) 55 { 56 return query(L, R, rt<<1|1); 57 } 58 else if (R <= m) 59 { 60 return query(L, R, rt<<1); 61 } 62 else 63 { 64 return query(L, m, rt<<1)+query(m+1, R, rt<<1|1); 65 } 66 } 67 68 int main() 69 { 70 int T, n, i, a, b; 71 char s[10]; 72 scanf("%d", &T); 73 for (i=1; i<=T; i++) 74 { 75 printf("Case %d:\n", i); 76 scanf("%d", &n); 77 build(1, n, 1); 78 while(scanf("%s", s), s[0] != 'E') 79 { 80 if (s[0] == 'A') 81 { 82 scanf("%d%d", &a, &b); 83 update(a, b, 1); 84 } 85 else if (s[0] == 'S') 86 { 87 scanf("%d%d", &a, &b); 88 update(a, -b, 1); 89 } 90 else if (s[0] == 'Q') 91 { 92 scanf("%d%d", &a, &b); 93 printf("%d\n", query(a, b, 1)); 94 } 95 } 96 } 97 return 0; 98 }