中文题,而且也都说的很明白了。
就是一个裸的线段树,也没什么说的了。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 5e4+10;
int a[maxn],tree[maxn*4];
void Build(int p,int l,int r)
{
if(l == r)
{
tree[p] = a[l];
return;
}
int mid = (l + r) / 2;
Build(p * 2,l,mid);
Build(p * 2 + 1,mid + 1,r);
tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
void Change(int p,int l,int r,int x,int num)
{
if(l == r)
{
tree[p] += num;
return;
}
int mid = (l + r) / 2;
if(x <= mid)
Change(p * 2,l,mid,x,num);
else
Change(p * 2 + 1,mid + 1,r,x,num);
tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
int Query(int p,int l,int r,int L,int R)
{
int ans = 0;
if(L <= l && R >= r)
return tree[p];
int mid = (l + r) / 2;
if(R <= mid)
return Query(p * 2,l,mid,L,R);
if(L > mid)
return Query(p * 2 + 1,mid + 1,r,L,R);
return Query(p * 2,l,mid,L,mid) + Query(p * 2 + 1,mid + 1,r,mid+1,R);
}
int main()
{
int t,cas = 1;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n; i++)
scanf("%d",&a[i]);
Build(1,1,n);
printf("Case %d:\n",cas++);
char s[15];
while(~scanf("%s",s))
{
if(s[0] == 'Q')
{
int l,r,ans;
scanf("%d %d",&l,&r);
ans = Query(1,1,n,l,r);
printf("%d\n",ans);
}
else if(s[0] == 'A' || s[0] == 'S')
{
int x,num;
scanf("%d %d",&x,&num);
if(s[0] == 'S')
num = -num;
Change(1,1,n,x,num);
}
else if(s[0] == 'E')
break;
}
}
return 0;
}