题意:中文题
思路:简单树状数组应用
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 50000+100 //最大元素个数
#define LL long long
int cas=1,T;
int n; //元素个数
int c[maxn]; //c[i]==A[i]+A[i-1]+...+A[i-lowbit(i)+1]
//返回i的二进制最右边1的值
int lowbit(int i)
{
return i&(-i);
}
//返回A[1]+...A[i]的和
int sum(int i)
{
int ans = 0;
while (i)
{
ans+=c[i];
i -= lowbit(i);
}
return ans;
}
//令A[i] += val
void add(int i,int val)
{
while (i<=n)
{
c[i]+=val;
i += lowbit(i);
}
}
int main()
{
//freopen("in","r",stdin);
scanf("%d",&T);
while (T--)
{
printf("Case %d:\n",cas++);
memset(c,0,sizeof(c));
scanf("%d",&n);
for (int i = 1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
add(i,temp);
}
string temp;
while (cin >> temp)
{
if (temp[0] == 'Q')
{
int i,j;
scanf("%d%d",&i,&j);
printf("%d\n",sum(j) - sum(i-1));
}
if (temp[0] == 'A')
{
int i,j;
scanf("%d%d",&i,&j);
add(i,j);
}
if (temp[0] =='S')
{
int i,j;
scanf("%d%d",&i,&j);
add(i,-j);
}
if (temp[0] == 'E')
{
break;
}
}
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}