题意:
单点add,区间sum。
题解:
线段树可以很好的写这个题,但是树状数组显得更加有效,快捷!
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50000+10;
int c[maxn];
int lowbit(int x)
{
return x & -x;
}
int sum(int x)
{
int res=0;
while(x>0)
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
void add(int x,int v)
{
while(x<maxn)
{
c[x]+=v;
x+=lowbit(x);
}
}
int main()
{
int t;
cin>>t;
for(int kase=1;kase<=t;kase++)
{ printf("Case %d:\n",kase);
int n;
cin>>n;
for(int i=0;i<n+10;i++)
c[i] = 0;
for(int i=1;i<=n;i++)
{
int v;
scanf("%d",&v);
add(i,v);
}
char str[5];
while(scanf("%s",str))
{
if(str[0] == 'E')
break;
else if(str[0] == 'Q')
{
int i,j;
scanf("%d%d",&i,&j);
printf("%d\n",sum(j)-sum(i-1) );
}
else if(str[0] == 'A')
{
int x,v;
scanf("%d%d",&x,&v);
add(x,v);
}
else
{
int x,v;
scanf("%d%d",&x,&v);
add(x,-v);
}
}
}
}