敌兵布阵

http://acm.hdu.edu.cn/showproblem.php?pid=1166

Input
第一行一个整数T,表示有T组数据。
每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。
接下来每行有一条命令,命令有4种形式:
(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令
 

 

Output
对第i组数据,首先输出“Case i:”和回车,
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数最多不超过1000000。
 

 

Sample Input
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 
Sample Output
Case 1:
6
33
59
View Code
 1 #include <cstdio>
2
3 #define lson l , m , rt << 1
4 #define rson m + 1 , r , rt << 1 | 1
5 const int maxn = 55555;
6 int sum[maxn<<2];
7 void PushUP(int rt) {
8 sum[rt] = sum[rt<<1] + sum[rt<<1|1];
9 }
10 void build(int l,int r,int rt) {
11 if (l == r) {
12 scanf("%d",&sum[rt]);
13 return ;
14 }
15 int m = (l + r) >> 1;
16 build(lson);
17 build(rson);
18 PushUP(rt);
19 }
20 void update(int p,int add,int l,int r,int rt) {
21 if (l == r) {
22 sum[rt] += add;
23 return ;
24 }
25 int m = (l + r) >> 1;
26 if (p <= m) update(p , add , lson);
27 else update(p , add , rson);
28 PushUP(rt);
29 }
30 int query(int L,int R,int l,int r,int rt) {
31 if (L <= l && r <= R) {
32 return sum[rt];
33 }
34 int m = (l + r) >> 1;
35 int ret = 0;
36 if (L <= m) ret += query(L , R , lson);
37 if (R > m) ret += query(L , R , rson);
38 return ret;
39 }
40 int main() {
41 int T , n;
42 scanf("%d",&T);
43 for (int cas = 1 ; cas <= T ; cas ++) {
44 printf("Case %d:\n",cas);
45 scanf("%d",&n);
46 build(1 , n , 1);
47 char op[10];
48 while (scanf("%s",op)) {
49 if (op[0] == 'E') break;
50 int a , b;
51 scanf("%d%d",&a,&b);
52 if (op[0] == 'Q') printf("%d\n",query(a , b , 1 , n , 1));
53 else if (op[0] == 'S') update(a , -b , 1 , n , 1);
54 else update(a , b , 1 , n , 1);
55 }
56 }
57 return 0;
58 }
posted @ 2012-03-22 18:46  qijinbiao1  阅读(261)  评论(0编辑  收藏  举报