这题用树状数组做,属于数据结构的题。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#define mem(a) memset(a, 0, sizeof(a))
using namespace std;
int c[50005], n;
char ch[10];
int lowbit(int a)
{
return a & (-a);
}
void add(int a, int v)
{
while(a <= n)
{
c[a] += v;
a += lowbit(a);
}
return;
}
int sums(int a)
{
int sum = 0;
while(a > 0)
{
sum += c[a];
a -= lowbit(a);
}
return sum;
}
int main(int argc, char *argv[])
{
int i, j, cas, a, b, o = 0;
scanf("%d", &cas);
while(cas--)
{
printf("Case %d:\n", ++o);
mem(c);
scanf("%d", &n);
for(i = 1;i <= n;i++)
{
scanf("%d", &j);
add(i, j);
}
for(;;)
{
mem(ch);
scanf("%s", ch);
if(strcmp(ch, "Query") == 0)
{
scanf("%d%d", &a, &b);
if(a > b)
printf("%d\n", sums(a) - sums(b - 1));
else
printf("%d\n", sums(b) - sums(a - 1));
}
else if(strcmp(ch, "Add") == 0)
{
scanf("%d%d", &a, &b);
add(a, b);
}
else if(strcmp(ch, "Sub") == 0)
{
scanf("%d%d", &a, &b);
add(a, -b);
}
else if(strcmp(ch, "End") == 0)
break;
}
}
return 0;
}