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 ;
}

你可能感兴趣的:(HDU)