题目大意:敌兵有N个军营,排成一排,a[i]表示第i个军营的人数,有几种操作,当输入的是“Query i j”时,表示从第i个军营到第j个军营的人数总和,当输入 Add i j,表示第i个军营加入j个人,当输入 Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
思路:树状数组
/*
* File: main.cpp
* Author: Administrator
*
* Created on 2010年1月24日, 下午6:36
*/
#include <stdlib.h>
#include<iostream>
#include<string>
using namespace std;
#define N 50005
int a[N], in[N], n;
int Lowbit(int x) {
return x & (x^(x - 1));
}
void Modify(int pos, int num) {
while (pos <= n) {
in[pos] += num;
pos += Lowbit(pos);
}
}
int Query(int end) {
int sum = 0;
while (end > 0) {
sum += in[end];
end -= Lowbit(end);
}
return sum;
}
/*
*
*/
int main(int argc, char** argv) {
int i, j, ca, c, a1, a2, sum1, sum2;
char ch[20];
cin >> ca;
for (c = 1; c <= ca; c++) {
cin >> n;
for (i = 1; i <= n; i++) {
cin >> a[i];
}
for (i = 1; i <= n; i++) {
in[i] = 0;
}
for (i = 1; i <= n; i++) {
Modify(i, a[i]);
}
cout << "Case " << c << ":" << endl;
while (cin >> ch) {
if(strcmp(ch,"End")==0)break;
if (strcmp(ch, "Query") == 0) {
cin >> a1 >> a2;
sum1 = Query(a1-1);
sum2 = Query(a2);
cout << sum2 - sum1 << endl;
}
if (strcmp(ch, "Add") == 0) {
cin >> a1 >> a2;
Modify(a1, a2);
}
if (strcmp(ch, "Sub") == 0) {
cin >> a1 >> a2;
a2 = -a2;
Modify(a1, a2);
}
}
}
return (EXIT_SUCCESS);
}