这个题是树状数组入门题,若是输入1,则将对应的口袋清空,更新树状数组;若是2,将对应口袋加上一定的值,并更新树状数组;若输入3,则查找所求区间的和。
另外,题意中口袋的序号是从0开始的,所以更新时一定记得加1。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int ar[100010];
int n,q;
int lowbit(int x)
{
return x&(-x);
}
void add(int i, int v)
{
while(i<=n)
{
ar[i]+=v;
i+=lowbit(i);
}
}
int sum(int i)
{
int s = 0;
while(i > 0)
{
s += ar[i];
i -= lowbit(i);
}
return s;
}
int main()
{
int t, c[100010], x;
while(scanf("%d",&t)!=EOF)
{
for(int i=1;i<=t;i++)
{
memset(ar, 0, sizeof(ar));
scanf("%d%d",&n,&q);
for(int j=1;j<=n;j++)
{
scanf("%d",&c[j]);
add(j,c[j]);
}
printf("Case %d:\n",i);
while(q--)
{
int a, b;
scanf("%d",&x);
if(x==1)
{
scanf("%d",&a);
printf("%d\n", c[a+1]);
add(a+1,-1*c[a+1]);
c[a+1]=0;
}
else if(x==2)
{
scanf("%d%d",&a,&b);
add(a+1,b);
c[a+1]+=b;
}
else
{
if(x==3)
{
scanf("%d%d",&a,&b);
printf("%d\n",sum(b+1)-sum(a));
}
}
}
}
}
return 0;
}