HDU 1166 敌兵布阵

数状数组 模板题

/*
(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 表示结束,这条命令在每组数据最后出现;
当然线段树也可以解决,不过没树状数组方便 哈哈
*/
#include
<iostream>
#include
<stdlib.h>
#include
<string.h>
using namespace std;

const int MAXN = 50001;

int camp[MAXN], n;
int a[MAXN];

inline
int lowbit(int t){
return t & (-t);
}
void add(int i, int v){
while(i <= n){
a[i]
+= v;
i
+= lowbit(i);
}
}
int sum(int i){
int s = 0;
while(i > 0){
s
+= a[i];
i
-= lowbit(i);
}
return s;
}

int main(){
int t, cas = 0, i, j;
char cmd[10];
bool end = false;
cin
>> t;
while( t-- ){
cout
<< "Case " << ++cas << ":" << endl;
memset(a,
0, sizeof(a));
end
= false;
cin
>> n;
for(int i = 1; i <= n; ++i){
cin
>> camp[i];
add(i, camp[i]);
}
while(cin >> cmd)
{
switch(cmd[0])
{
case 'A':
cin
>> i >> j;
add(i, j);
break;
case 'S':
cin
>> i >> j;
add(i,
-j);
break;
case 'Q':
cin
>> i >> j;
cout
<< sum(j) - sum(i - 1) << endl;
break;
default:
end
= true;
break;
}
if(end)
break;
}
}
return 0;
}
posted @ 2011-04-07 17:23  L..  阅读(178)  评论(0编辑  收藏  举报