其实这道题用树状数组会更简单一些。。。。
在网上找的代码。。。
贴一下:
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int n, a[50005];
char sh[15];
int lowbit(int i) //树状数组最巧妙之处:i&(-i)
{
return i&(-i);
}
void update(int i, int val) //更新函数
{
while(i <= n)
{
a[i] += val;
i += lowbit(i);
}
}
int sum(int i) //求和函数
{
int sum = 0;
while(i > 0)
{
sum += a[i];
i -= lowbit(i);
}
return sum;
}
int main()
{
int i, val, t, x, y, zz = 1;
scanf("%d", &t);
while(t--)
{
memset(a, 0, sizeof(a));
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
scanf("%d", &val);
update(i, val);
}
printf("Case %d:\n", zz++);
while(scanf("%s", sh))
{
if(sh[0] == 'E') break;
scanf("%d %d", &x, &y);
if(sh[0] == 'A') update(x, y);
else if(sh[0] == 'S') update(x, -y);
else printf("%d\n", sum(y)-sum(x-1)); //两段区间和相减
}
}
return 0;
}