#include<stdio.h>
#include<string.h>
#define N 50005
int num[N];
struct node
{
int L;
int R;
int sum;
}list[N*4];
void build(int k,int x,int y)
{
list[k].L = x;
list[k].R = y;
if( list[k].L == list[k].R )
{
list[k].sum = num[list[k].L];
return;
}
int mid = (x+y)>>1;
build(k<<1,x,mid);
build(k<<1|1,mid+1,y);
list[k].sum = list[k<<1].sum + list[k<<1|1].sum ;
}
int find(int k,int x,int y)
{
int ans;
if(list[k].L == x && list[k].R == y)
{
ans = list[k].sum ;
return ans;
}
int mid = (list[k].L + list[k].R )>>1;
if(x<=mid && y<=mid) find(k<<1,x,y);
else if(x>mid && y>mid) find(k<<1|1,x,y);
else
{
ans = find(k<<1,x,mid) + find(k<<1|1,mid+1,y);
return ans;
}
}
void update(int k,int x,int y)
{
if(list[k].L == x && list[k].R ==x)
{
list[k].sum = y;
return ;
}
int mid = (list[k].L + list[k].R )>>1;
if(x<=mid) update(k<<1,x,y);
else update(k<<1|1,x,y);
list[k].sum = list[k<<1].sum + list[k<<1|1].sum ;
}
int main()
{
int t;
int i;
int n;
int a,b;
char str[10];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&num[i]);
build(1,1,n);
while(scanf("%s",str),strcmp(str,"End"))
{
scanf("%d%d",&a,&b);
if(strcmp(str,"Query")==0) printf("%d\n",find(1,a,b));
else if(strcmp(str,"Add")==0) update(1,a,num[a]+=b);
else if(strcmp(str,"Sub")==0) update(1,a,num[a]-=b);
}
}
return 0;
}
再来一个树状数组的。
#include<stdio.h>
#include<string.h>
#define N 50005
int a[N],c[N];
int n,r = 1;
int lowbit(int x)
{
return x&-x;
}
void update(int k,int x)
{
while(k<=n)
{
c[k] += x;
k+=lowbit(k);
}
}
int sum(int x)
{
int ans=0;
while(x>0)
{
ans += c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
int t,i;
int a1,a2;
char str[25];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(c,0,sizeof(c));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
update(i,a[i]);
}
printf("Case %d:\n",r++);
while(scanf("%s",str),strcmp(str,"End"))
{
scanf("%d%d",&a1,&a2);
if(strcmp(str,"Query")==0) printf("%d\n",sum(a2)-sum(a1-1));
else if(strcmp(str,"Add")==0) a[a1]+=a2,update(a1,a2);
else if(strcmp(str,"Sub")==0) a[a1]-=a2,update(a1,-a2);
}
}
return 0;
}